Flutter Bloc用数据填充初始状态

时间:2020-11-10 23:52:23

标签: flutter dart bloc flutter-bloc

我有一个关于块正确代码放置的问题,可以这么说。 因此,由于bloc代表业务逻辑组件,因此我已在类内部移动了业务逻辑(例如处理数据方法)。因此,现在有2种方法,一种用于获取,另一种用于保存数据。 接下来,我有我的组件,该组件应在AddInitial中显示正在加载的内容,然后在火灾集团中说“嘿,我在这里需要数据”。是正确的还是反模式?代码看起来像这样。

BlocBuilder<AddBloc, AddState>(
  buildWhen: (previous, current) {
    // code is ommited
  },
  builder: (context, state) {
    if (state is ExpensesLoaded || state is CategoryChanged) {
      // code is ommited
    } else if (state is ExpensesLoading) {
      return getProgressSpinner();
    } else if (state is AddInitial) {
      // is it ok? If it's antipattern please give an advise how to do it correctly
      context.bloc<AddBloc>().add(CategoryChange([category]));
      return getProgressSpinner();
    } else {
      print('Bloc Loaded. Nothing to show inside Month Expenses...');
      return Container();
    }
  }

关于context.bloc<AddBloc>().add(CategoryChange([category]));的问题。是反模式吗?应该怎么做?

当它看起来像这样时。下次当我将CategoryChange事件添加到bloc(将产生CategoryChanged状态)时,由于某种原因,上面的生成器没有反应...

谢谢!

我正在使用Flutter 1.22.3,flutter_bloc:6.1.0

1 个答案:

答案 0 :(得分:0)

这应该怎么做?

当您在创建Bloc时知道其初始状态(假设静态列表中默认情况下已预先选择第一个条目),则可以使用将初始状态作为参数的Bloc构造函数。

如果您不知道正确的初始状态是什么,因为它是动态的(请说一下,基于GPS的服务从加载的位置列表中,用户必须点击按钮才能获得,因为这要花钱)那么最好具有“空”或“未初始化”或“ waitingForUserInteraction”状态。毕竟,那 就是程序的状态。

当它看起来像这样时。下次我将CategoryChange事件添加到bloc(将产生CategoryChanged状态)构建器时,由于某种原因,它没有反应

集团通过比较旧状态和新状态来确定是否发出新状态更改。如果要修改默认行为,可以确保两个状态比较相等(或不相等)。最简单的方法是像这样从包equatable中的Equatable得出状态:

@immutable
abstract class SomeState extends Equatable {
  final String importantChange;
  final String unimportantChange;

  const SomeState(this.importantChange, this.unimportantChange);

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

仅在“ props”列表中列出一个字段意味着在比较是否相等时仅对此进行比较。如果importantChange相等,则认为状态相等(并且不会从Bloc中发出)。 importantChange相同但unimportantChange不同的两个状态被视为相同。