Flutter 状态管理(BloC):无状态与有状态小部件

Posted

技术标签:

【中文标题】Flutter 状态管理(BloC):无状态与有状态小部件【英文标题】:Flutter State Management (BloC): Stateless vs Stateful widget 【发布时间】:2020-03-10 21:20:40 【问题描述】:

所以我正在阅读Bloc 以了解flutter 的状态管理。

既然 Bloc 允许您接收和流式传输(根据输入重新构建小部件),那么是否可以构建一个主要使用无状态小部件的应用程序?

例如,假设我制作了许多单一的无状态类小部件,因此几乎所有东西都被划分为自己的无状态小部件。

使用 Bloc 状态管理,我可以简单地重建某个无状态子小部件以反映更改。

在这种方法中,我认为不需要使用有状态小部件。当然,作为flutter 的初学者,我想知道这种方法是否有任何优点。

这是一个好方法吗?任何信息将不胜感激。

【问题讨论】:

尝试使用提供者模式,更简单并且支持流,并且您可以使用有状态或无状态小部件而不考虑提供者。 是的,我研究了提供程序模式,但似乎普遍认为它对于复杂的应用程序并不理想,而对于原型设计来说却相当不错,因为它存在分离表示和业务的限制逻辑分开。不妨从 Bloc 开始。 您编写 Provider 类,所有状态都在特定于类型的中心位置进行管理,不会混淆。查看 Youtube 上的 Flutter 频道,他们将应用程序从 Bloc 转换为 Provider,以及您获得的代码量/复杂性降低。 youtube.com/watch?v=HrBiNHEqSYU 这是一个很好的资源!我一定会检查出来的。谢谢哥们! =) 提供者无法扩展的“普遍共识”是错误的。无论如何,几乎所有流行的状态管理解决方案都使用提供程序。甚至集团。 【参考方案1】:

你说得对,你只能使用 StatelessWidgets。你只需要知道你在哪里创建你的集团。某些实例化方式比其他方式更容易测试,例如将 bloc 作为参数传递给 StatelessWidget。

但对于实现,我最喜欢 flutter_bloc 库: https://pub.dev/packages/flutter_bloc

它包括BlocProvider,它会自动处理块的创建和处置。

要注意的另一件事是,您通常必须在一个集团中启动一个事件才能执行某些操作,而 StatefulWidget 可能有助于在 initState 方法中运行它。

您可以在StatefulWidget 中说:

initState()
   _myBloc = SomeBloc()..add(SomeEvent());


// Then somewhere in your widget tree
BlocProvider<MyBloc>(
  create: (context) => _myBloc,
  builder: (context, state) ,
)

或者,在您的StatelessWidget

BlocProvider<MyBloc>(
  create: (context) => MyBloc()..add(SomeEvent()),
  builder: (context, state) ,
)

你会找到最适合你的,但我发现 Flutter 主要取决于特定功能的情况和目标。没有必要让自己养成总是需要使用 StatelessWidget 的习惯,但你是对的,它是可能的。

【讨论】:

谢谢!我希望我在 3 小时前找到了这个答案 ;-)【参考方案2】:

您只能使用无状态小部件。但是有一个问题是你应该在应用程序被处理之前关闭流。可以通过两种方式处理:

    首先,您可以在 stateful 的 dispose 方法中使用 Stateful 小部件并关闭 bloc 流。

    使用 BlocProvider。在这种情况下,Bloc Provider 只是一个有状态的小部件。它会自动关闭流。然后你可以在 Stateless Widget 中使用 BlocProvider 来使用 bloc。

但这并不意味着我们不需要有状态的小部件。例如,有状态的小部件在动画中很重要。动画、文本输入或小部件本身的任何本地更改不应在 bloc 或其他状态管理中处理。这是小部件本身的职责。

【讨论】:

但是文本输入可以由 bloc 控制,RX 流支持合并两个流和一些有用的操作,但是对于动画,应该开发它。

以上是关于Flutter 状态管理(BloC):无状态与有状态小部件的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - flutter_bloc状态管理

Flutter BLoC:管理主要数据类型的状态

Flutter 状态管理之Bloc上

Flutter 状态管理之Bloc上

Flutter 状态管理之Bloc上

Flutter Bloc 状态管理