提供者与 Get_it

mFe*_*ein 31 dependency-injection service-locator flutter flutter-provider

在搜索 Flutter 的依赖注入解决方案时,我发现了两个很棒的库:providerget_it.

据我所知provider,它有更多的样板文件,但它非常适合 Flutter ,一旦注入的值发生变化,就Consumer可以重建Widget树的一部分。

get_it 另一方面更直接,更容易使用,并且不依赖于 Flutter,因此可以与任何 Dart 代码一起使用。

它们之间还有什么区别和限制吗?我知道这有点自以为是,但 Flutter 太新了,所以最好公开注册好处、副作用和陷阱。

Rém*_*let 34

两者的主要区别provider不是严格的依赖注入

通过使用小部件,provider还可以:

  • 提供程序与 Flutter 开发工具兼容
  • 知道何时无法访问变量(范围为树)
  • 知道何时创建和处置对象
  • 同步模型 -> 模型和模型 -> UI
  • 仅覆盖特定小部件树的某些值
  • 主动防止循环依赖

从长远来看,所有这些都是可选的,但对您的应用程序的健康有益。

它确保您始终保持最新状态,使“意大利面条式代码”变得更加困难,并使您的不同元素更加可组合。

  • 这未免太片面了。get_it 更简单,可以在没有上下文的情况下使用。它也不会用服务提供者来扰乱您的小部件树。所以我认为最好同时使用两者,但用于不同的用途。 (4认同)
  • @Rémi-Rousselet 那么,作为 Provider 的开发人员,您能否就何时优先使用 Get It 而不是 Provider 提供一些见解? (2认同)

M.A*_*han 6

我只是在解释我实际发现的一个限制,可能还有其他限制。

在搜索了许多关于 Get_it 的教程和主题后,即使我们在提供程序中有依赖注入,为什么人们仍然使用 Get_it(),我无法理解 DI 方面的差异。然后我陷入了一个场景,并找到了“有什么限制”的问题的答案。

它们之间还有什么区别和限制吗?

设想:

我有嵌套小部件,小部件 A 有小部件 B,小部件 B 有小部件 C,我正在使用提供程序,并且每当值更改时都在访问每个小部件中的值。很棒,然后我制作了一个新的小部件 D,它是一个单独的小部件,它不在小部件 A 层次结构中。但是当我尝试在 Widget D 中访问相同的值时,它并没有改变。因为widget D 不在Widget A 的树中。现在来了provider 依赖注入的限制。

结论

您将使用 Get_it 访问树小部件之外的值。但是您无法使用 provider 访问更新后的值

更新答案

在上面的场景中,你需要用 Provider 包裹 app 才能访问所有的依赖。

  • 是的,提供程序与小部件树一起使用,但大多数时候您可以在树的根部使用提供程序注入对象,以便您的所有应用程序都可以读取这些依赖项。 (2认同)