Matan
Matan

Reputation: 31

Unable to remove added list element

I've added a list element by using the following method:

listToAddTo.add(italianFood());

However, when I try removing the same element by using the method:

listToAddTo.remove(italianFood());

it does not work.

I've tried using the removeWhere method with the parameters item == italianFood(), the retainWhere method with the item != italianFood() parameters, and the removeAt method with the listToAddTo.indexOf(italianFood()) parameters, however, none of those seem to work.

When I try printing the list, I get the following result:`

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

Above methods with this result also seem to have no effect.

Necessary code is as follows:

  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());
          },
        ),
      ],
    ),
  ],
);

Upvotes: 3

Views: 277

Answers (2)

Harry Terkelsen
Harry Terkelsen

Reputation: 2714

The problem is that italianFood() returns a new ListView instance on each call. So when you call listToAddTo.add(italianFood()) you are creating a new ListView instance (let's call it LV1) and you end up with listToAddTo being [LV1].

When you call listToAddTo.remove(italianFood()) you are creating a new ListView instance (let's call it LV2) and asking listToAddTo to remove anything that is equal to LV2, so this ends up doing nothing since LV2 is not in listToAddTo.

You could fix this by making italianFood a field.

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

Upvotes: 2

diegoveloper
diegoveloper

Reputation: 103351

You can't remove it because are different objects.

Every time you use italianFood() you create a new instance of the class.

Create a gloval variable :

 ListView _myItalianFood;

Instantiate:

in your add method:

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

Remove:

 listToAddTo.remove(_myItalianFood);

Upvotes: 3

Related Questions