首页 > 解决方案 > 与riverpod一起颤抖,如何更新导航堆栈中已经存在的页面上的状态

问题描述

我有一些遵循此流程的 Flutter/riverpod/navigator 2.0 页面。

项目列表页面 -> 导航到 -> 编辑项目页面 -> 后退按钮 -> 项目列表页面。

问题是当一个人点击后退按钮时,项目列表不会用新内容更新,因为该页面缓存在页面导航堆栈中。

对如何处理这种情况有什么建议吗?

标签: flutterflutter-navigationriverpod

解决方案


好的,我刚刚开始工作!非常简短的版本是在您的第一个表单上使用嵌套在 ProviderListener 内的消费者。对我来说,第一种形式显示了检索到的模型列表。在那个列表页面上,我有...

  Widget build(BuildContext context) {
    return ProviderListener(
      onChange: (context, state) {
      // Below Model.save in provider sets state to
      // "Success(model)". This triggers here and we
      // List.update in provider to update fields in
      // the Model in the List. Then the Consumer
      // below triggers on "Data(model)" state and the
      // List refreshes and shows updated Model
      if (state is Success) {
          context.read(regionListNotifierProvider.notifier).update(state.model);
        }
      },
      provider: regionNotifierProvider,
      child: Consumer(builder: (context, watch, child) {
        final state = watch(regionListNotifierProvider);

在 List 页面上,每个 Tile 都是可点击的。当您单击它时,它使用模型提供程序将状态设置为您刚刚单击的模型。然后它导航到表单。表单读取状态并查看您在列表中单击的模型的信息。

在我的 ModelForm (您在其中编辑模型字段)中,当您保存时,它会触发其提供程序中的保存方法。在那里,它触发上面的 .update,然后 ModelForm Navigator.pops 回到 List 页面,然后依次在上面的 Listener 和 Consumer 触发器,List 显示更新的数据。

注意: ProviderListener 正在监听 ModelForm 提供者,然后 Consumer 正在监听 List 提供者。跟随?这是最终奏效的诀窍

注意 2:这些都是无状态小部件。只需要 Riverpod 提供程序中的状态。他们什么都做。

注意 3:这 2 个提供者来回交谈。列表将单击的模型提供给表单,当表单保存时,列表页面会听到并更新模型列表

如果您需要,我很乐意添加更多详细信息:-)


推荐阅读