提供商与 Get_it
Provider vs. Get_it
在搜索 Flutter 的依赖注入解决方案时,我发现了两个很棒的库:provider
和 get_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
在搜索 Flutter 的依赖注入解决方案时,我发现了两个很棒的库:provider
和 get_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