如何使用 Providers 或 Riverpod 在 Flutter 中构建我的状态管理?

问题描述

我正在编写一个相对简单的应用程序,我需要在其中进行一些状态管理。在查看了所有文档和许多重写后,我需要帮助来理解如何实际构建和使用为状态管理提供的工具,如经典提供者和 Riverpods 提供者。 我的问题涉及保持状态的模型的排列,嵌套这些对象并仅重绘小部件树的一部分。

我的项目是一款移动应用,可让您共享加油站和支付金额的日志。如果您与一个或多个人共用一辆车,你们都会进入一个显示燃料条目的池。有用户、日志条目和池的模型。当用户登录时,需要获取并存储多个可用池,选择后需要获取所选池的成员和日志。如果对例如进行更新用户名或特定日志条目,当前视图可能需要更新。

现在,当前的代码一团糟,其中大部分状态都存储在池模型中,该模型由小部件树根部的 ChangeNotifierProvider 提供。由于我的印象是应该尝试尽可能少地更新 UI,因此我尝试将我的状态拆分为不同的模型,这些模型相互嵌套,例如 LogEnries 是池的一部分模型,但它们本身是 ChangeNotifier。这个想法是为了能够有选择地刷新和聆听状态的一部分。这导致我有时需要从池模型/状态对象外部调用 notifyListeners() 的可怕代码。我想通过重写我的状态管理来纠正这种情况。

现在我的问题是:一个结构通常如何(或特别是我的状态)才能使其高效并取悦创造图书馆的魔法之神? This stackoverflow question from two/one ago 问了一个类似的问题,提供的答案建议您做以下事情之一:

  1. 保持状态嵌套并使用 ChangeNotifierProvider 将模型相互注入,但如果提供的对象是模型,这显然不是很好
  2. 将所有内容放在一个状态对象中,其提供者位于树的顶部,并且可能使用选择器仅刷新受影响的 UI 部分
  3. 嵌套模型,但只提供根作为不可变对象并通过调用函数和复制内容更新状态

我认为另一种方法是

  1. 使用最近发布的 riverpod 包并为各种需求创建大量提供程序。

现在我不知道这些方法中哪一个更好或有效,或者它们是否都工作得很好。我关于相应方法的问题是:

  1. 我将按照什么顺序嵌套它们?我直观地将池嵌套在根状态对象中,池模型中的日志条目但依赖明智我可能不得不去 User->AppState->selectedPool->Logs,导致可能的语句 logEntry.selectedPool.appState.user .感觉怪怪的。

  2. 这可能可行,但我总是在一个模型中获得整个状态(这在我的用例中可能没有那么大)。可以使用 Selector 仅刷新 UI 的一部分,但我认为为此使用可变对象存在问题,因为 Selector 需要能够判断某些内容是否已更改。此外,据我所知,我只能使用我专门选择的内容,而不会监听与我之后用于刷新 UI 的属性不同的属性。

  3. 和上面一样,还有很多样板代码。

  4. 这个看起来最令人兴奋,因为riverpod 和它的提供者看起来真的很酷。但是我会嵌套我的状态还是只是在全局范围内提供所有内容,并可能在创建方法中使用 ref.watch() 注入一些东西?我会为我想单独收听的每个更改创建一个新的提供程序,还是在我获得对象后弄清楚它是否更便宜?由于 Riverpod 相当于 ChangeNotifier,StateNotifier 只有一个 Value(我认为?),我是否会为我需要的每条重要信息创建一个新的提供程序?

正如您可能已经注意到的那样,我试图查找很多东西,但还没有完全弄清楚如何将所有技术转化为超出代码演示大小的实际项目。如果有人可以向我解释一般情况下构建状态管理的正确方法,我将非常感激,哪种方法可能是最适合我的特定情况的方法,最重要的是可能是决定反对其他方法的原因。请毫不犹豫地指出我犯的任何错误,尽管 stackoverflow 的声誉表明这可能不是问题。如果有人想看一下我的 code,我在一个分支中开始着手实现更好的模块化,从 AppState 模型开始并重新设计一些函数。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...