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

时间:2019-11-14 20:00:26

标签: flutter dart stateless bloc

好吧,所以我正在阅读Bloc的状态管理器。

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

作为一个例子,假设我制作了许多单个无状态类窗口小部件,因此几乎所有内容都被划分为自己的无状态窗口小部件。

借助Bloc状态管理,我可以简单地重建某些无状态的子窗口小部件以反映更改。

在这种方法中,我认为不需要使用有状态的小部件。当然,作为一个扑朔迷离的初学者,我想听听这种方法是否有好处。

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

谢谢!

3 个答案:

答案 0 :(得分:6)

很正确,您只能使用StatelessWidgets。您只需要知道在何处创建您的集团。某些实例化方法比其他方法更容易测试,例如将bloc作为参数传递给StatelessWidget。

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

它包括BlocProvider,它可以自动处理集团的创建和处置。

要注意的另一件事是,您通常必须在某个团体中启动一个事件才能执行某些操作,而StatefulWidget对于在initState方法中运行该事件可能很有用。 / p>

您可以在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的习惯,但您是对的,这是可能的。

答案 1 :(得分:3)

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

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

  2. 使用BlocProvider。在这种情况下,Bloc Provider仅是有状态的小部件。它会自动关闭流。然后,您可以在无状态小组件中使用BlocProvider使用bloc。

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

答案 2 :(得分:0)

使用浮动块模式的最佳方法是使用有状态的小部件,因为只要有更改,您就可以侦听流和setstate。