【问题标题】:Deleting a widget from a list of widgets [Flutter]从小部件列表中删除小部件 [Flutter]
【发布时间】:2020-10-21 15:56:06
【问题描述】:

在我正在构建的颤振应用程序(基本上是一个待办事项列表)中,我希望使用一个按钮删除所有已完成的任务(活动复选框)。 到目前为止,只有当最后一个复选框处于活动状态并且所有其他活动复选框(如果有)同时位于其正上方时,它才会按预期运行。

如果在一个激活的复选框之后还有一个非激活的复选框,应用就会出现故障。

这是创建任务小部件的类的代码:

class addnote extends StatefulWidget {

  final String task_txt;
  final int index;// receives the value

  addnote({ Key key, this.task_txt, this.index }): super(key: key);

  @override
  _addnoteState createState() => _addnoteState();
}

class _addnoteState extends State<addnote> {

  bool value=false;
  
  Widget txt_strike(String to_strike, bool str_value){
    return str_value ?
    AutoSizeText(to_strike,style: TextStyle(
      decoration: TextDecoration.lineThrough,
      fontFamily: "Quicksand",
      fontSize: 20.0,
      color: Colors.grey,
    ),
    maxLines: 2,
      overflow: TextOverflow.ellipsis,
    )
        :
    AutoSizeText(to_strike,style: TextStyle(
      //decoration: TextDecoration.lineThrough,
      fontFamily: "Quicksand",
      fontSize: 20.0,
      color: Colors.black,
    ),
    maxLines: 2,
      overflow: TextOverflow.ellipsis,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        decoration: BoxDecoration(
        borderRadius:BorderRadius.circular(4.0),
        boxShadow: [BoxShadow(
        color:Colors.grey,
        offset: Offset(-6.0,4.0),
        blurRadius: 4.0,
        )],
            color: Colors.white
        ),
         margin: EdgeInsets.symmetric(vertical: 5.0,horizontal: 3.0),
      child:InkWell(

        onTap: (){setState(() {
          value=!value;
          w_checks[widget.index]=!w_checks[widget.index];
        });},
        child: Row(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            Expanded(flex:1,
              child: CircularCheckBox(
                  disabledColor: Colors.white,
                  activeColor: Colors.green,
                  value: value,
                  onChanged:(bool _changed)
                  {
                    // print(w_checks[Index]);
                    setState(() {
                      value=!value;
                      w_checks[widget.index]=!w_checks[widget.index];
                    });
                  }),
            ),
            Expanded(flex:5,
                child: txt_strike(widget.task_txt, value)),
           ],
        ),
      )
    );
  }
}

这是删除任务小部件的函数的代码:

void del_task(){
   int count=0;
   for(int i=0; i<w_checks.length; i++)
   {
     if(w_checks[i]==true)
       count++;
   }
   while(count>=0)
   {
     for(int j=0; j<w_checks.length; j++)
     {
       if(w_checks[j]==true)
       {
         setState(() {
           { w_tasks.removeAt(j);  //w_tasks is the list of all the tasks
           w_checks.removeAt(j);   //w_checks is the list that stores bool values corresponding to each checkbox
           }
         });
         for(int k=j; k<w_checks.length; k++)
           {
             w_tasks[k]=w_tasks[k+1];
             w_checks[k]=w_checks[k+1];

           }
         break;
       }
     }
     count--;
   }
 }

希望我能够描述我的问题,请提供帮助。

【问题讨论】:

  • 类似这样的东西:List&lt;String&gt; numbers = ['one', 'two', 'three', 'four']; numbers.removeWhere((item) =&gt; item.length == 3); print(numbers); // [three, four']
  • @pskink 是的,我知道这种方法,但我还没有尝试在这里使用它。我会尽力让你知道。

标签: flutter widget


【解决方案1】:

我不太确定你在 del_task() 内部做什么,但我认为你的问题是由 for 循环引起的,在该循环中你将所有后面的对象向下移动一个位置。

该操作已由“list.removeAt(index)”方法执行,您可以从文档中看到:https://api.dart.dev/stable/2.10.2/dart-core/List/removeAt.html

我会像这样更改代码:

void del_task(){
   for(int i=0; i<w_checks.length; i++)
   {
       if(w_checks[i]==true)
       {
         setState(() {
           w_tasks.removeAt(i);  
           w_checks.removeAt(i);   
         });
         i--;
       }
   }
 }

我不明白您为什么需要 count 变量。

我发布的代码应该遍历w_checks。 当它找到一个“真”值时,它会调用removeAt(i),然后将索引减一。

【讨论】:

  • 好的,所以我对列表中删除的方式感到困惑。我认为 .removeAt(ind) 不会移动元素,所以我创建了一段代码来将元素移动一个位置。此外,'count' 变量会计算要从列表中删除的元素的数量,并且不再需要它,因为每次删除后元素都会自动移动。
  • 我试过你的代码,问题依旧。你能看看创建小部件的类吗?也许那里需要一些改变,我就是想不通。
  • 我正在尝试在项目中实现你的代码,我会尽快告诉你
  • 我无法在我的应用中复制您的代码。我认为与创建小部件的类无关。
  • 我很确定是 del_task() 或创建小部件的类,因为其他一切看起来都很好
猜你喜欢
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多