0

我正在使用 BLoC(cubit)在颤振中创建一个异步计数器应用程序。当我发出加载状态时,计数器不会增加而是返回到 0。如何解决这个问题?

代码:

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';

part 'counter_state.dart';
class CounterCubit extends Cubit<CounterState> {
  CounterCubit() : super(Counter(counter: 0));

  void increment() {
    print('before CounterLoading() ${state.counter}');
    emit(CounterLoading());
    print('after CounterLoading() ${state.counter}');

    Timer(Duration(seconds: 2), () {
      emit(CounterLoaded());
      print('enter code hereprevious  state ${state.counter}');
      emit(Counter(counter: state.counter + 1));
      print('next state ${state.counter}');
    });
  }
}

part of 'counter_cubit.dart';

@immutable
abstract class CounterState {
  final int counter = 0;
}

class Counter extends CounterState {
  final int counter;
    
  Counter({this.counter});
}

class CounterLoading extends CounterState {
  CounterLoading();
}

class CounterLoaded extends CounterState {
  CounterLoaded();
}
4

1 回答 1

0

问题是您的其他状态不包含具有counter值的构造函数。因此,使用抽象类的默认值 - 0。为了保持状态,您应该在所有状态中设置计数器值。这是重新设计的状态代码:

@immutable
abstract class CounterState {
  final int counter;
  
  CounterState({this.counter = 0});
}

class Counter extends CounterState {
  // you do not need the counter property here, it is defined in the base class    
    
  Counter({required int counter}) : super(counter: counter);
}

class CounterLoading extends CounterState {
  CounterLoading({required int counter}) : super(counter: counter);
}

class CounterLoaded extends CounterState {
  CounterLoaded({required int counter}) : super(counter: counter);
}

并相应地调整你的肘:

class CounterCubit extends Cubit<CounterState> {
  CounterCubit() : super(Counter(counter: 0));

  void increment() {
    print('before CounterLoading() ${state.counter}');
    emit(CounterLoading(counter: state.counter));
    print('after CounterLoading() ${state.counter}');

    Timer(Duration(seconds: 2), () {
      emit(CounterLoaded(counter: state.counter));
      print('enter code hereprevious  state ${state.counter}');
      emit(Counter(counter: state.counter + 1));
      print('next state ${state.counter}');
    });
  }
}
于 2021-05-23T19:27:58.313 回答