Flutter:为什么 Provider 比只有静态单例的 AppGlobal 类更好?

JVE*_*999 13 dart flutter flutter-provider

根据我对 flutter 包的理解Provider,它是一种在小部件之间共享对象的方法。我知道另一种方法是创建一个类,例如AppGlobal,并定义static整个应用程序可以使用的各种变量。有人建议这Provider是一种更好的方法,但我不明白为什么会这样。

Haj*_*cke 9

这个问题的答案应该考虑不同的方面:

  1. 可测试性 - 差别不大。这两种情况都需要更改代码以替换单例本身或“提供的单例”
  2. 代码耦合 - 也没有太大区别(请参阅关于可测试性的评论)
  3. 范围 - 单例通常贯穿整个应用程序的生命周期。为某些小部件子树管理单例很容易出错。这里 provider 肯定有它的优势,它负责创建和处理。
  4. UI 更新 - 使用单例时,必须使用setState完全手动编码, 这将产生大量容易出错的样板代码。Provider 已经幕后提供了这一点。
  5. 侦听器 - 在应用程序的某一部分更改状态应通知该状态的所有消费者。对于单身人士,这必须手动构建。Provider 已经幕后提供了这一点。
  6. 延迟加载 - 默认情况下,值是延迟加载的,这意味着在第一次读取值而不是第一次创建提供程序时调用它们。这可以通过以下方式禁用lazy: false

希望这能更深入地回答这个问题。


小智 4

通过网络快速搜索,变量的全局实例似乎不是最好的主意,因为它不可测试,并且它使代码与 AppGlobal 类非常耦合。

这是一个描述我正在谈论的内容的链接,并且它提供了很好的示例。

全局访问与提供商的范围访问

  • 为什么全局单例不可测试?我可以用一些模拟来代替它。难道我不需要对提供给提供者的课程做同样的事情吗?耦合有什么区别?要替换全局类,我需要更改代码。如果我想更改提供给提供者的类,是否也需要同样的操作?在我看来,“Provider”的优点是“范围访问”(包括不再需要时的处置)。这样做的缺点是可读性较低,如果能看到两种方法的性能比较那就太好了。 (2认同)