繁体   English   中英

"Flutter Riverpod 不调用函数"

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM