无法删除添加的列表元素

问题描述 投票:3回答:2

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

listToAddTo.add(italianFood());

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

listToAddTo.remove(italianFood());

这是行不通的。

我尝试使用带有参数item == italianFood()的removeWhere方法,带有item!= italianFood()参数的retainWhere方法,以及带有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());
          },
        ),
      ],
    ),
  ],
);
dart flutter
2个回答
2
投票

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

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

创建一个发光变量:

 ListView _myItalianFood;

实例:

在你的添加方法中:

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

去掉:

 listToAddTo.remove(_myItalianFood);

2
投票

问题是italianFood()在每次调用时返回一个新的ListView实例。因此,当你打电话给listToAddTo.add(italianFood())时,你正在创建一个新的ListView实例(让我们称之为LV1),你最终得到的listToAddTo[LV1]

当你调用listToAddTo.remove(italianFood())时,你正在创建一个新的ListView实例(让我们称之为LV2)并要求listToAddTo删除任何等于LV2的东西,所以这最终什么都不做,因为LV2不在listToAddTo

你可以通过使italianFood成为一个字段来解决这个问题。

final italianFood = ListView(shrinkWrap: true, ...);

© www.soinside.com 2019 - 2024. All rights reserved.