Всем привет и спасибо, что посмотрели на мой вопрос.
У меня проблема: у меня есть список элементов, каждый из которых имеет статус избранного, и у меня есть страница, на которой показаны избранные элементы. Я хочу, чтобы страница обновлялась и удаляла не избранные элементы, когда я переключаю статус избранного.
Попытка с ChangeNotifierProxyProvider также безуспешна, статус меняется, но notifyListeners не обновляет основной список. Я знаю трюк с enpty setState в середине приложения, чтобы вызвать refre sh, но я знаю, что есть более аккуратный метод с участием Provider, о котором я не знаю.
Еще раз спасибо!
Это код (я сделал его максимально коротким)
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => Collection(),
builder: (context, child) => MaterialApp(
home: MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final _list = Provider.of<Collection>(context).favItems;
return Scaffold(
appBar: AppBar(
title: Text("Test"),
),
body: Container(
child: ListView.builder(
itemCount: _list.length,
itemBuilder: (_, index) => ChangeNotifierProvider.value(
value: _list[index],
child: CardWidget(),
),
),
),
);
}
}
class CardWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final _item = Provider.of<Items>(context);
return Card(
child: Row(
children: <Widget>[
Text(_item.name),
IconButton(
icon:
_item.favourite ? Icon(Icons.star) : Icon(Icons.star_border),
onPressed: () {
_item.toggleFavourite();
})
],
),
);
}
}
class Collection with ChangeNotifier {
List<Items> _items = [
Items(name: "a", favourite: true),
Items(name: "b", favourite: true),
Items(name: "c", favourite: true),
];
List<Items> get favItems =>
[..._items].where((element) => element.favourite == true).toList();
}
class Items with ChangeNotifier {
String name;
bool favourite;
Items({this.name, this.favourite});
toggleFavourite() {
favourite = !favourite;
notifyListeners();
}
}