提供程序与Get_it

时间:2019-07-23 17:45:06

标签: flutter dependency-injection service-locator flutter-provider

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

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

另一方面,

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

它们之间是否还有其他区别和限制?我知道这有点自以为是,但是Flutter太新了,因此最好注册公共利益,副作用和陷阱。

3 个答案:

答案 0 :(得分:3)

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

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

它们之间是否还有其他区别和局限性?

场景:

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

结论

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

注意

您需要使用提供程序包装应用程序以访问所有依赖项。

答案 1 :(得分:2)

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

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

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

从长远来看,所有这些选项都是可选的,它们对您的应用程序的健康有好处。

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

答案 2 :(得分:0)

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

如果要在一个类的两个或多个实现之间快速切换,这很有用。例如,对服务进行模型化,然后在“真实”服务或伪服务之间进行切换(出于调试目的)。

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