【问题标题】:What's the proper way to dependecy inject with Provider?使用Provider进行依赖注入的正确方法是什么?
【发布时间】:2020-04-30 09:13:10
【问题描述】:

我正在构建一个应用程序,并希望使用 Provider 作为我的 DI 工具。

我想构建一个具有以下架构的应用:

  • 观看次数
  • 视图模型
  • 服务

视图是简单的 UI,由(几乎)每个视图的视图模型支持。这些视图模型依赖于服务持有的值。

使用ChangeNotifierProvider 扩展视图模型以反映 UI 中的变化,这可以正常工作。但是我应该用什么来响应服务的变化。单个服务可以在多个视图模型中使用,当然,我需要让它们都保持最新。

我查看了一些教程,在Flutter Provider v3 Architecture using ProxyProvider for Injection 中挖掘,但它真的没有向我解释这种情况,或者我不明白。

ProxyProvider 用于那里的其他情况。 Viewmodel 向服务发出请求,但它的值直接在 UI 中使用。

使这种连接工作的正确方法是什么?我应该在这种情况下使用ChangeNotifierProxyProvider 吗?我应该使用流吗?

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    如你所说,使用 di 有 ProxyProvider; ProxyProvider 可以是应用范围(在应用小部件顶部声明,因此可以在应用内的任何位置访问,例如 AuthService)或小部件(屏幕)范围,例如您的 ViewModel

    在这个例子中,A 是 MyWidget 的 ViewModel,B 是 Service 附言。您应该在此层次结构之上提供另一个具有 B 类的 Provider,以便 ProxyProvider 可以访问它以“提供”给 A 类

    ProxyProvider<B, A>(
            create: (_) => A(),
            update: (_, b, a) => a..bClassVariable = b,
            dispose: (_, a) => a.dispose(), //if you use streams
            child: MyWidget(
    
            ),
          )
    

    关于你的最后一个答案,没有答案)只有你应该决定哪种方法更适合你的需求,如果你熟悉 ViewVievModel,你可以继续使用它,或者学习一些新的东西,比如 BloC

    附言。如果您使用 ViewModel ChangeNotifierProxyProvider 将正常工作 如果你使用块流应该使用

    【讨论】:

      最近更新 更多