[英]Flutter Riverpod does not call function
我从 Flutter 开始,我选择 Riverpod 来管理我的状态。 我创建了一个具有两个功能的 StateNotifier,一个 setSelected 选择菜单中的项目,另一个 getSelected 检查谁被选中并更改颜色。 第一个适用于点击,但第二个仅在启动页面时有效。
以下是我的课程:
1- MenuNotifier
class MenuNotifier extends StateNotifier<CategoryModel> {
MenuNotifier() : super(menuItem);
static CategoryModel menuItem = CategoryModel.allCategories.first;
void setSelected(CategoryModel item) {
menuItem = item;
print(menuItem.id);
}
bool getSelected(CategoryModel item) {
return menuItem.id == item.id ? true : false;
}
}
2 - 菜单类别组件
final menuProvider = StateNotifierProvider<MenuNotifier, CategoryModel>((ref) {
return MenuNotifier();
});
class MenuCategoryComponent extends ConsumerWidget {
List<CategoryModel> allCategories = CategoryModel.allCategories;
@override
Widget build(BuildContext context, WidgetRef ref) {
return Container(
color: uiColor.second,
child: ListView.builder(
itemCount: allCategories.length,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
return Consumer(builder: (context, ref, _) {
final _menuItem = ref.watch(menuProvider.notifier);
return Container(
color: ref
.read(menuProvider.notifier)
.getSelected(allCategories[index])
? uiColor.comp_1
: uiColor.second,
child: TextButton(
style: TextButton.styleFrom(
padding: EdgeInsets.zero,
alignment: Alignment.center,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
),
child: Padding(
padding: const EdgeInsets.all(10),
child: Text(allCategories[index].label!,
style: uiTextStyle.text1),
),
onPressed: () {
ref
.read(menuProvider.notifier)
.setSelected(allCategories[index]);
},
),
);
});
}),
);
}
}
如您所见,我有一个容器,如果所选项目与 ListView 中的当前项目相同,则该容器应使用返回布尔值的条件更改颜色。 我使用从 Riverpod 读取。
我认为问题在于您正在观看
.notifier<\/code>而不是通过文档收听其更改:
获取与此 [StateNotifierProvider] 关联的 [StateNotifier],而不监听它。
如果重新创建了 [StateNotifier],侦听此提供程序可能会导致提供程序\/小部件重新构建。
因此,如果您想收听更改,您应该使用 ref.watch(menuProvider)。 另外作为提示,您可以使用 select 过滤该值:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.