37

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

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

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

它们之间是否还有更多的区别和限制?我知道这有点固执己见,但 Flutter 太新了,公开注册好处、副作用和陷阱是件好事。

4

4 回答 4

37

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

通过使用小部件,provider还能够:

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

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

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

于 2019-07-23T18:01:11.357 回答
6

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

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

它们之间是否还有更多的差异和限制?

设想:

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

结论

您将使用 Get_it 从树小部件中访问值。但是您无法使用提供程序访问更新的值

更新的答案

在上述场景中,您需要使用 Provider 包装应用程序以访问所有依赖项。

于 2020-09-02T11:23:08.893 回答
1

Get It 不是依赖注入解决方案,而是服务定位器。

如果您想在一个类的两个或多个实现之间快速切换,这很有用。例如模拟一项服务,并在“真实”服务或假服务之间进行切换(用于调试目的)。

实际上,它无法检索/提供对现有对象的引用(单例除外,但您可以自己做同样的事情而无需付出更多努力)并且只能提供新对象。

于 2020-06-21T14:42:49.670 回答
0

通过各种教程的流式传输,我了解到 get it 包可以称为全局变量,可以从任何小部件访问任何小部件,无论是否嵌套 VS 提供程序只能在嵌套小部件之间访问。M.ArslanKhan 更好地解释了这个例子

于 2021-08-14T17:08:32.113 回答