首页 > 解决方案 > Flutter BLoC 变量最佳实践

问题描述

最近开始使用 BLoC 方法来构建应用程序,但不清楚的一件事是在哪里“保留” BLoC 变量。我想我们可以有这两种选择:

  1. 在 BLoC 类中声明一个变量;例如,在我的课堂上,我可以执行以下操作:
class ModulesBloc extends Bloc<ModulesEvent, ModulesState> {
   late String myString;
}

并在我的 UI 中访问它,如下所示:

BlocProvider.of<ModulesBloc>(context).myString;
  1. 将其保留为状态变量;例如,我可以如下声明我的状态类:
class ModulesState extends Equatable {
   const ModulesState({required this.myString});

   final String myString;

  @override
  List<Object> get props => [myString];
}

并在我的 UI 中访问它,如下所示:

BlocBuilder<ModulesBloc, ModulesState>(
   builder: (BuildContext context, ModulesState modulesState) {
      modulesState.myString;
   }
)

上述任何方法是否存在任何性能损失/状态稳定性问题?

谢谢!

标签: flutterdartbloc

解决方案


我不确定是否有绝对的答案,但我至少可以给出我的意见。

在 bloc 中有 3 个对象:bloc, event, state.

state是可变部分,而是bloc您的问题的描述(state每个要发出的内容event)。因此,在我看来,描述您的问题的不可变变量应该放在bloc. 但是,任何可能改变的东西都是state你的 bloc (与state你的小部件相同),因此应该存储在state.

例子:

您想创建一个可以设置计时器的应用程序。在这个应用程序中,您可以拥有多个计时器,每个计时器将由name.

在这种情况下:

  • 您的状态将是一个对象,其中包含一个名为 的双变量timeCount,例如,它将每秒递增一次。
  • 您将有一个final名为的字段name,必须在创建秒表期间设置该字段。

有趣的是,如果您希望该集团也处理秒表创建,您将有两种状态:第一个是空的,第二个是带有nameand的timeCount。看看如何自然地name变得可变,因此在state现在被发现。


推荐阅读