弹出菜单按钮不起作用。它更改值,但不重新渲染屏幕



我是个新手,正在努力完成我的第一项任务。我一直在到处找,但找不到为什么PopupMenuButoon不起作用。我只使用它在所有项目和收藏夹之间切换,但它只更改值,不会重新显示屏幕。这是我的代码片段。

enum FilterOptions {
Favorites,
All,
}
...
@override
Widget build(BuildContext context) {
bool _showOnlyFavorites = false;
return Scaffold(
appBar: AppBar(
actions: [
PopupMenuButton(
itemBuilder: (_) => [
PopupMenuItem(
child: Text('Only Favorites'),
value: FilterOptions.Favorites,
),
PopupMenuItem(
child: Text('Show All'),
value: FilterOptions.All,
),
],
onSelected: (FilterOptions selectedValue) {
setState(() {
if (selectedValue == FilterOptions.Favorites) {
setState(() {
_showOnlyFavorites = true;
});
} else {
setState(() {
_showOnlyFavorites = false;
});
}
});
},
),
],
...
),
body: RecipesGrid(_showOnlyFavorites),
class RecipesGrid extends StatelessWidget {
bool isFav;
RecipesGrid(this.isFav);
@override
Widget build(BuildContext context) {
final recipeData = Provider.of<RecipeProvider>(context);
List<Recipe> recipes = isFav == false ? recipeData.recipes : recipeData.favoritesList;
return GridView.builder(
itemCount: recipes.length,
padding: EdgeInsets.all(10),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1,
mainAxisSpacing: 10,
crossAxisSpacing: 5,
childAspectRatio: 2.3 / 1,
),
itemBuilder: (context, i) => ChangeNotifierProvider.value(
value: recipes[i],
child: isFav == true && recipes == []
? Text('You don't have any favorites yet. Start adding some!')
: RecipeItem(),
),
);
}
}
bool _showOnlyFavorites = false;

此变量是build方法的局部。这意味着每次调用build函数时,它都会被丢弃并恢复为指定的值。出于显而易见的原因,将状态更改保存在每次状态更改时都会重置的变量中是行不通的。

你需要把这个变量放在其他地方。如果这是一个状态类,您可以将其放在类级别上,否则您需要一些状态管理方法。你似乎已经有了一个提供者,所以你知道它是如何工作的。

不要以嵌套的方式使用setState。只需遵循下面给出的代码:

if (selectedValue == FilterOptions.Favorites) {
setState(() {
_showOnlyFavorites = true;
});
} else {
setState(() {
_showOnlyFavorites = false;
});
}

最新更新