提供 BLoC - 全局与特定

din*_*ngo 0 dart flutter flutter-bloc

我目前正在学习使用 BLoC 模式进行 Flutter 和 Dart 的状态管理和架构。

我遇到过两种在小部件中提供对 BLoC 的访问的方法。

1 - 访问小部件并将其传递到另一个屏幕时使用 BLoCProvider 或 BLoCProvider.value。

2 - 将您的 MaterialApp 小部件包装在 BLoCProvider 中,以提供对全局块的访问。

似乎使用第二个选项总是最简单的 - 管理 BLoC 的单个位置,构建上下文引用没有问题,确保单个 BLoC 实例,并允许全局访问!

以这种方式创建和提供所有应用程序 BLoC 是否有任何缺点?是否存在性能问题等?

Rob*_*erg 7

我昨天在另一个问题中简单回答过这个问题。

简而言之:

  • 需要全球访问的集团当然应该如此。例如,这可能是一个正在处理身份验证或通知的块......
  • 其他块不应该是全局可访问的,例如,这可能是一个处理从后端服务获取信息的块等。我很想听听任何好的推理,为什么处理特殊内容的小部件树下方的屏幕应该具有全局块任何其他小部件都可以访问的可访问性...

让所有块都可在全球范围内访问可能会对性能产生负面影响,并且会破坏常见的良好编程实践。

编辑:

这是来自 flutter bloc 的创建者(Felix Angelov)的:

在全球范围内提供所有集团的主要缺点是:

  • 这些块永远不会关闭,因此即使当前小部件树没有使用它们,它们也会消耗资源
  • 即使块的状态仅限于特定功能,也可以从任何地方访问块
  • 这些块通常最终需要某种“重置”事件来恢复到初始状态,如果它们的范围正确并由 BlocProvider 自动处置,则不需要这种情况

我的建议是为每个功能创建一个块,并仅将该块提供给需要它的特定子树。希望有帮助

  • 我不知道,谢谢您的声明! (2认同)