【问题标题】:Flutter state management, trigger state change from outside widget treeFlutter 状态管理,从外部 widget 树触发状态变化
【发布时间】:2021-03-14 16:07:51
【问题描述】:

我有以下组件:

  1. DataModel(一个包含一些变量的类),在我的例子中是一个单例
  2. 反映此 DataModel 的几个屏幕
  3. 更新 DataModel 的几个触发器,其中两个是非 UI:来自 HTTP 调用的响应和来自 WebSocket 的数据

我正在尝试在 Flutter 中实现以下流程: 监听来自 HTTP 响应 / WebSocket 的数据 -> 更新 DataModel(状态改变) -> 更新 UI

我已经阅读了有关状态管理的不同方法 (https://flutter.dev/docs/development/data-and-backend/state-mgmt/options),并尝试了其中的一些方法(例如 Provider)。 我的主要问题是我无法弄清楚如何从非 UI 组件(如 HTTP 响应/WebSocket)更新我的 DataModel,因为我需要包含一个上下文(在这种情况下这真的无关紧要)才能更新我的DataModel,类似这样的:

Provider.of<DataModel>(context).onUpdate(myDataModel)

完成此任务的最简单方法是什么(更新 DataModel -> 触发 UI 更新)?

【问题讨论】:

    标签: flutter state provider


    【解决方案1】:

    你检查Riverpod 包了吗? Riverpod 来自 Provider 的创建者,可以认为是对 provider 的重写,以进行原本不可能的改进。 Riverpod 不依赖于 Flutter,因此它能够在没有 BuildContext 的情况下监听提供者。

    【讨论】:

    • 查看了文档和示例。寻找一个简单的例子,其中被监视的对象是一个类(具有属性和方法),并且不扩展 List (或类似的东西)。另外 - 无法弄清楚如何声明一个可供我项目中的任何类/小部件访问的提供程序:final testData = Provider((_) => TestData());
    • 我会要求您查看回答您两个问题的示例:github.com/rrousselGit/river_pod/tree/master/examples/todos Rivepod.dev 有很好的文档。 (Ans:1) 在此页面上,您可以看到如何创建一个扩展 StateNotifies => github.com/rrousselGit/river_pod/blob/master/examples/todos/lib/… 的类 (Ans:2) 声明 Provider 的最常见方法是将它们声明为全局常量,如下所示: final myProvider = Provider ((ref) { return MyValue(); });不要害怕供应商的全球性。提供者是完全不可变的。
    • 我也推荐你看下面的视频,看完前两个你会对Riverpod有很好的了解,但是看全部,你会学到很多东西(a)youtube.com/watch?v=GVspNESSess(b)@ 987654326@ (c) youtube.com/watch?v=ttUNVsIl1tM (d) youtube.com/watch?v=atwWbkBdepE (e) youtube.com/watch?v=ls8Jm-viQkc
    • 感谢视频:它们确实添加了很多信息。至于问题2(与状态管理无关):如果我声明final int temp = 1;在 main.dart 中,如何从另一个类/小部件访问它?
    • 如果最终 int temp = 1;具有全局范围,然后只需在您希望从中访问它的库(文件)中导入 main.dart
    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 2021-08-18
    • 2021-02-10
    • 2018-12-06
    • 2021-12-10
    • 2021-08-20
    • 2021-04-11
    • 2021-03-04
    相关资源
    最近更新 更多