无法删除添加的列表元素

时间:2018-09-07 22:25:15

标签: dart flutter

我使用以下方法添加了一个列表元素:

listToAddTo.add(italianFood());

但是,当我尝试使用以下方法删除相同的元素时:

listToAddTo.remove(italianFood());

它不起作用。

我尝试使用带有参数item == italianFood()的removeWhere方法,带有项目!= italianFood()参数的keepWhere方法以及带有listToAddTo.indexOf(italianFood())参数的removeAt方法,但是,这些似乎都不起作用。

当我尝试打印列表时,得到以下结果:`

ListView(
   scrollDirection: vertical,
   primary: using primary controller,
   scrollPhysics: AlwaysScrollableScrollPhysics,
   shrinkWrap: shrink-wrapping
)

具有该结果的上述方法似乎也没有效果。

必要的代码如下:

  List listToAddTo = [];

 ListView italianFood() {
return ListView(
  shrinkWrap: true,
  children: <Widget>[
    listEntry(
      'Fast Food Nana',
      'Mon - Sun 06:00 - 04:00',
      Container(
        child: IconButton(
          icon: Icon(
            Icons.motorcycle,
            size: 30.0,
          ),
        ),
      ),
      IconButton(
        icon: Icon(
          Icons.navigation,
          size: 30.0,
        ),
      ),
    ),
  ],
);


  Container filterItem(String label, value, onChanged) {
return Container(
  decoration: BoxDecoration(color: Colors.white),
  child: CheckboxListTile(
    value: value,
    title: Text(label),
    onChanged: onChanged,
  ),
);



bool isTrue = false;

  Widget build(BuildContext context) {
return Stack(
  children: <Widget>[
    Container(
      margin: const EdgeInsets.only(top: 45.0),
      child: ListView.builder(
        itemCount: listToAddTo.length,
        itemBuilder: (BuildContext context, int Index) {
          return (listToAddTo[Index]);
        },
      ),
    ),
    ExpansionTile(
      title: Text('Filters'),
      children: <Widget>[
        filterItem(
          'Italian',
          isTrue,
          (bool value) {
            setState(() {
              if (isTrue == false) {
                listToAddTo.add(italianFood());
                isTrue = !isTrue;
              } else {
                listToAddTo.removeAt(listToAddTo.indexOf(italianFood()));
                isTrue = !isTrue;
              }
            });
            print(listToAddTo);
            print(italianFood());
          },
        ),
      ],
    ),
  ],
);

2 个答案:

答案 0 :(得分:2)

您不能删除它,因为它们是不同的对象。

每次使用italianFood()时,都会创建一个class的新实例。

创建一个全局变量:

 ListView _myItalianFood;

实例化:

在您的添加方法中:

  _myItalianFood = italianFood();
  listToAddTo.add(_myItalianFood);

删除:

 listToAddTo.remove(_myItalianFood);

答案 1 :(得分:2)

问题是italianFood()在每次调用时都会返回一个新的ListView实例。因此,当您调用listToAddTo.add(italianFood())时,您正在创建一个新的ListView实例(我们将其命名为LV1),最后您将listToAddTo称为[LV1]

调用listToAddTo.remove(italianFood())时,您将创建一个新的ListView实例(我们将其命名为LV2),并要求listToAddTo删除等于{{1} },因此最终无济于事,因为LV2不在LV2中。

您可以通过将listToAddTo设置为字段来解决此问题。

italianFood