小部件不会在提供者变量更改时重绘 - Flutter
Widget not redrawing on Provider variable change - Flutter
我有一个名为“FavoritesProvider”的提供程序,它有一个名为“_favoritos”的变量,我在其中存储了一个 ID 列表。
我正在尝试做的是,每次将新项目添加到收藏夹变量或从中删除时,都会重新绘制一个 ListView 小部件。这是我执行此操作的函数,我在其中更新变量和 notifyListeners。
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: Statless 小部件只包含我自己的 FavDoneList 小部件。
- FavDoneList:包含列表的有状态小部件。 -> 我要re-render它。
我尝试使用侦听器,但它不会重绘:
@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,
));
}
你能帮我理解我做错了什么吗?我不知道如何重绘它。
谢谢!
我用一些“丑陋”的东西解决了它:
由于我的提供者、消费者或听众中的 none 可以工作,我打算在每次按下中间底部选项卡时重新加载整个 FavDoneList 小部件。就性能而言,这是一个非常小的代价,不会对用户造成太大影响。
我在主页上这样做了:
void _onItemTapped(int index) {
if (index == 1) {
setState(() {
_widgetOptions.removeAt(1);
_widgetOptions.insert(1, FavDoneList(key: UniqueKey()));
_selectedIndex = index;
});
} else {
setState(() {
_selectedIndex = index;
});
}}
传递唯一键非常重要,否则不起作用。
我有一个名为“FavoritesProvider”的提供程序,它有一个名为“_favoritos”的变量,我在其中存储了一个 ID 列表。
我正在尝试做的是,每次将新项目添加到收藏夹变量或从中删除时,都会重新绘制一个 ListView 小部件。这是我执行此操作的函数,我在其中更新变量和 notifyListeners。
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: Statless 小部件只包含我自己的 FavDoneList 小部件。
- FavDoneList:包含列表的有状态小部件。 -> 我要re-render它。 我尝试使用侦听器,但它不会重绘:
@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,
));
}
你能帮我理解我做错了什么吗?我不知道如何重绘它。 谢谢!
我用一些“丑陋”的东西解决了它:
由于我的提供者、消费者或听众中的 none 可以工作,我打算在每次按下中间底部选项卡时重新加载整个 FavDoneList 小部件。就性能而言,这是一个非常小的代价,不会对用户造成太大影响。
我在主页上这样做了:
void _onItemTapped(int index) {
if (index == 1) {
setState(() {
_widgetOptions.removeAt(1);
_widgetOptions.insert(1, FavDoneList(key: UniqueKey()));
_selectedIndex = index;
});
} else {
setState(() {
_selectedIndex = index;
});
}}
传递唯一键非常重要,否则不起作用。