【问题标题】:Flutter BLoC variables best practiceFlutter BLoC 变量最佳实践
【发布时间】:2021-11-26 17:13:57
【问题描述】:

最近开始使用 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;
   }
)

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

谢谢!

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

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

    在 bloc 中有 3 个对象:bloceventstate

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

    示例:

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

    在这种情况下:

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

    有趣的是,如果您希望该集团也处理秒表创建,您将有 2 个状态:第一个是空的,第二个是 nametimeCount。看看name 是如何自然地变成可变的,因此现在可以在state 中找到。

    【讨论】:

    • 感谢 Lulupointu 提供的好例子!所以最终,它是关于“解释”哪些变量是可变的,哪些不是..
    • 嗯,这不是什么解释,你总是知道哪个是哪个^^但是如果你的意思是确定是的话就是这样。
    • 是的,这就是我的意思。所以最后的想法是,在我有一个更新的模块列表(添加、删除项目等)的情况下,我将在 BLoC 类中对其进行初始化,并使用状态来反映对它的更改。但我的另一个担忧是关于性能。如果有这方面的提示,那就太好了!
    • 我认为性能在这里并不重要。所有这些都是非常快速的基本操作,在最坏的情况下是异步的,因此它们不应该导致任何卡顿。关于你的情况,我认为你这样做是正确的,但你不应该在你的 bloc 中有一个引用你的列表的变量,你应该只用它来实例化你的初始状态(在super)。除非您稍后需要参考此列表,在这种情况下,这可能是有争议的,我认为我仍然会将其保留在该州,但正如我所说,这更多的是一致性和个人偏好的问题
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2021-02-04
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2020-05-11
    相关资源
    最近更新 更多