提供商与 Get_it

Provider vs. Get_it

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

据我所知,provider 有更多样板文件,但它非常适合 Flutter,允许 Consumer 在注入后重建 Widget 树的部分值变化。

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

它们之间还有更多的区别和限制吗?我知道这有点自以为是,但 Flutter 太新了,公开登记好处、副作用和陷阱是件好事。

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

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

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

所有这些虽然都是可选的,但在长期 运行 中对您的应用程序的健康有益。

它确保您始终保持最新状态,使拥有 "spaghetti code" 变得更加困难,并使您的不同元素更具可组合性。

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

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

事实上它不能retrieve/supply引用现有对象(单例除外,但你可以自己做同样的事情而不需要更多努力)并且只能提供新对象。

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

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

Are there any more differences and limitations between them?.

场景:

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

结论

您将使用 Get_it 从树形小部件中访问值。但是你无法访问 使用 provider

更新值

更新答案

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

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