Flutter 状态管理 (BloC):无状态与有状态小部件
Flutter State Management (BloC): Stateless vs Stateful widget
所以我正在通读 Bloc
以了解 flutter
的状态管理。
既然 Bloc 允许你接收和流式传输(根据输入重建一个小部件),那么是否有可能构建一个主要使用无状态小部件的应用程序?
举个例子,假设我制作了很多单个无状态 class 小部件,因此几乎所有东西都被划分到它自己的无状态小部件中。
借助 Bloc 状态管理,我可以简单地重建某个无状态子小部件来反映更改。
在这种方法中,我看不到使用有状态小部件的必要性。当然,作为 flutter
的初学者,我想知道这种方法是否有任何优点。
这是一个好方法吗?任何信息将不胜感激。
您只能使用Stateless Widget。但是有一个问题,您应该在处理应用程序之前关闭流。可以通过两种方式处理:
首先可以使用Stateful widget,在stateful的dispose方法中close bloc的streams
使用 BlocProvider。在这种情况下,Bloc Provider 只是一个有状态的小部件。它会自动关闭流。然后你可以在Stateless Widget中使用BlocProvider来使用bloc。
但这并不意味着我们不需要有状态的小部件。例如,有状态小部件在动画中很重要。动画、文本输入或小部件本身的任何本地更改不应在 bloc 或其他状态管理中处理。这是小部件本身的职责。
你说得对,你只能使用 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 的习惯,但你是对的,这是可能的。
所以我正在通读 Bloc
以了解 flutter
的状态管理。
既然 Bloc 允许你接收和流式传输(根据输入重建一个小部件),那么是否有可能构建一个主要使用无状态小部件的应用程序?
举个例子,假设我制作了很多单个无状态 class 小部件,因此几乎所有东西都被划分到它自己的无状态小部件中。
借助 Bloc 状态管理,我可以简单地重建某个无状态子小部件来反映更改。
在这种方法中,我看不到使用有状态小部件的必要性。当然,作为 flutter
的初学者,我想知道这种方法是否有任何优点。
这是一个好方法吗?任何信息将不胜感激。
您只能使用Stateless Widget。但是有一个问题,您应该在处理应用程序之前关闭流。可以通过两种方式处理:
首先可以使用Stateful widget,在stateful的dispose方法中close bloc的streams
使用 BlocProvider。在这种情况下,Bloc Provider 只是一个有状态的小部件。它会自动关闭流。然后你可以在Stateless Widget中使用BlocProvider来使用bloc。
但这并不意味着我们不需要有状态的小部件。例如,有状态小部件在动画中很重要。动画、文本输入或小部件本身的任何本地更改不应在 bloc 或其他状态管理中处理。这是小部件本身的职责。
你说得对,你只能使用 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 的习惯,但你是对的,这是可能的。