我使用以下方法添加了一个列表元素:
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());
},
),
],
),
],
);
您无法删除它,因为它们是不同的对象。
每次使用italianFood()
时,都会创建一个class
的新实例。
创建一个发光变量:
ListView _myItalianFood;
实例:
在你的添加方法中:
_myItalianFood = italianFood();
listToAddTo.add(_myItalianFood);
去掉:
listToAddTo.remove(_myItalianFood);
问题是italianFood()
在每次调用时返回一个新的ListView
实例。因此,当你打电话给listToAddTo.add(italianFood())
时,你正在创建一个新的ListView
实例(让我们称之为LV1
),你最终得到的listToAddTo
是[LV1]
。
当你调用listToAddTo.remove(italianFood())
时,你正在创建一个新的ListView
实例(让我们称之为LV2
)并要求listToAddTo
删除任何等于LV2
的东西,所以这最终什么都不做,因为LV2
不在listToAddTo
。
你可以通过使italianFood
成为一个字段来解决这个问题。
final italianFood = ListView(shrinkWrap: true, ...);