У меня есть провайдер под названием "FavoritesProvider", у которого есть переменная "_favoritos", в которой я храню список идентификаторов.
Что я пытаюсь сделать, так это перерисовывать виджет ListView каждый раз, когда в переменную избранного добавляется или удаляется новый элемент. Вот функция, в которой я это делаю, где я обновляю переменную и уведомляюListeners.
Future setFavorites(
int id,
) async {
final prefs = await SharedPreferences.getInstance();
String _receivedData = (prefs.getString('favorites') ?? "");
List _decodedData = [];
if (_receivedData != "") {
_decodedData = json.decode(_receivedData);
}
String _sentData = "";
if (_decodedData.contains(id)) {
_decodedData.remove(id);
_sentData = json.encode(_decodedData);
} else {
_decodedData.add(id);
_sentData = json.encode(_decodedData);
}
prefs.setString("favorites", _sentData);
_favoritos = _decodedData;
notifyListeners();
return _favoritos;}
Элемент, который я пытаюсь перерисовать, вложен следующим образом:
- MainPage: каркасное тело, содержащее IndexedStack
List<Widget> _widgetOptions = [
HomePage(),
FavoriteScreen(),
CompletedScreen()
];
@override
Widget build(BuildContext context) {
return Scaffold(
body: IndexedStack(
index: _selectedIndex,
children: _widgetOptions,
),
- FavoriteScreen: виджет без статистики, содержащий только мой собственный виджет FavDoneList.
- FavDoneList: виджет с отслеживанием состояния, содержащий список. -> Я хочу перерендерить его. Я пытался использовать прослушиватель, но он не перерисовывается:
@override
Widget build(BuildContext context) {
var _favorites = Provider.of<FavoritesProvider>(context).favoritos;
if (flag == true) {
if (_favorites.isEmpty) {
return Center(child: Text("No has añadido favoritos"));
}
return ListView(
children: _loadFavorites(_favorites),
);
}
return Center(
child: CircularProgressIndicator(
color: Colors.red,
));
}
Можете ли вы помочь мне понять, что я делаю неправильно? Не могу понять как перерисовать. Спасибо!
Пожалуйста, добавьте сообщение об ошибке или какое-либо указание на то, в чем проблема. Спасибо!
Нет сообщения об ошибке @David, просто виджет не обновляется, как можно было бы ожидать от провайдера, но, несмотря на это, он работает нормально!
Я не вижу виджет провайдера нигде в вашем дереве виджетов. Вы используете правильную версию (вероятно, ChangeNotifierProvider)? Если да, можете ли вы добавить больше дерева виджетов, чтобы включить это?
Кроме того, вы не показываете, как/где вы вызываете setFavorites, это тоже может быть полезно. Вы уверены, что базовые данные действительно меняются? Попробуйте добавить точку останова и проверить, действительно ли _decodedData содержит новую информацию.
@ Дэвид, да, извини. ChangeNotifierProvider находится в корне моего приложения, поэтому он должен передавать информацию всем компонентам внутри моего приложения. setFavorites вызывается отдельной кнопкой в другом виджете. Но это работает, потому что когда я перезагружаю приложение, страница обновляется. :/ Сегодня я постараюсь обновить свой вопрос, извините за путаницу.