在 Bloc 中跨州存储临时数据的最佳实践

Best Practice for storing temp data across States in Bloc

我有一个使用 Bloc 的 Flutter 制作的简单计数器应用程序。这个想法是在用户按下增加按钮后,它会延迟 2 秒,显示加载,然后 increase/decrease 值。

计数器块包含 2 个状态,CounterValueCounterLoading。但是,每当我增加时,bloc 就会开始创建一个值为 0 的新 CounterLoading 对象。为了处理这个问题,我必须将 CounterValue 状态的当前值传递给 CounterLoading 状态,然后2 秒,我必须再次将 Loading 状态的当前值传递给 CounterValue 状态以增加值。因此,当涉及到我们中间有多个不需要数据而发出的第一个和最后一个状态是依赖的状态的实际情况时,这似乎是非常多余和混乱的。

使用 bloc 跨状态存储临时数据的最佳做法是什么?

counter_state.dart

class CounterState {
    int value = 0;
}

class CounterLoading extends CounterState {}

class CounterValue extends CounterState {}

counter_bloc.dart

class CounterBloc extends Bloc<CounterEvent, CounterState> {
    CounterBloc() : super(CounterValue()) {
      on<IncrementCounter>(
          (event, emit) async {
              emit(CounterLoading()..value = state.value);

              await Future.delayed(const Duration(seconds: 2));

              emit(CounterValue()..value = state.value + 1);
      },
    );
}

我建议研究不可变状态,这在使用 BLoC 时非常方便。这意味着您不是直接更改状态中的 属性 值,而是创建一个新的状态对象并替换以前的状态。

对于这个具体问题,我建议您使用更复杂的状态,而不是为 Loading/Value 使用两个单独的状态。例如:

州:

class CounterState {
  const CounterState({
    this.value = 0,
    this.isLoading = false
  });

  final int value;
  final bool isLoading;
}

区块链:

class CounterBloc extends Bloc<CounterEvent, CounterState> {
    CounterBloc() : super(CounterValue()) {
      on<IncrementCounter>(
          (event, emit) async {
              final cur = state.value;

              emit(CounterState(value: cur, isLoading: true));

              await Future.delayed(const Duration(seconds: 2));

              emit(CounterState(value: cur + 1, isLoading: false));
      },
    );
}