Search code examples
flutterprovider

Flutter Provider : cannot remove item from list in provider


I have checkbox listtile inside listview builder I want when I check any one then its data add to list then when I uncheck it be removed from list:

 Directionality(
            textDirection: TextDirection.rtl,
            child: ListView.builder(
                itemCount: student.length,
                itemBuilder: (context, index) {
                  return Card(
                      child: CheckBoxedListTile(
                          student[index], widget.date, widget.time,widget.teacher,widget.subject));
                }),
          ),
        );
      }
    }

check listtile widget is :

class _CheckBoxedListTileState extends State<CheckBoxedListTile> {
  var checked;
  @override
  void initState() {
    checked = false;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<AbsenceProvider>(builder: (context, absProv, child) {
      return CheckboxListTile(
        value: checked,
        onChanged: (val) {
          setState(() {
            checked = !checked;
          });
          var data = {
            "name": widget.student.name,
            "stage": widget.student.stage,
            "group": widget.student.group,
            "teacher": widget.teacher,
            "subject": widget.subject,
            "date": widget.date,
            "time": widget.time,
            "vacs": "No"
          };
          if (checked == true) {
            absProv.addAbs(data);
          } else {
            absProv.remAbs(data);
          }
          print(absProv.absences);
        },
        title: Text('${widget.student.name}'),
      );
    });
  }
}

provider is :

class AbsenceProvider with ChangeNotifier {
     var absences = [];
    addAbs(item) {
    absences.add(item);
    notifyListeners();
  }

  remAbs(item) {
    absences.remove(item);
    notifyListeners();
  }
}

when I click on check box it is add successfully but when i click again it is nor remove it


Solution

  • I solved it by using removeWhere :

    before :

    absences.remove(item);
    

    after :

    absences.removeWhere((e) => e['name'] == item['name']);