' 没有零参数构造函数,flutter,dart,bloc"/>

首页 > 解决方案 > 如何修复这个 Flutter 错误:超类 'Bloc' 没有零参数构造函数

问题描述

我正在关注本教程:https ://www.youtube.com/watch?v=dc3B_mMrZ-Q&t=11033s&ab_channel=ResoCoder

不幸的是,我拥有最新版本的 FLutter,并且还安装了所有依赖项的最新版本,因此必须更改代码以进行一些重大更改。

我收到此错误:

超类 'Bloc<NumberTriviaEvent, NumberTriviaState>' 没有零参数构造函数。尝试在“Bloc<NumberTriviaEvent, NumberTriviaState>”中声明零参数构造函数,或在“Bloc<NumberTriviaEvent, NumberTriviaState>”中显式调用不同的构造函数。

这是代码的相关部分:

class NumberTriviaBloc extends Bloc<NumberTriviaEvent, NumberTriviaState> {
  final GetConcreteNumberTrivia getConcreteNumberTrivia;
  final GetRandomNumberTrivia getRandomNumberTrivia;
  final InputConverter inputConverter;

  NumberTriviaBloc({
    @required GetConcreteNumberTrivia concrete,
    @required GetRandomNumberTrivia random,
    @required this.inputConverter,
  })  : assert(concrete != null),
        assert(random != null),
        assert(inputConverter != null),
        getConcreteNumberTrivia = concrete,
        getRandomNumberTrivia = random;

  NumberTriviaState get initialState => Empty();

  @override
  Stream<NumberTriviaState> mapEventToState(
    NumberTriviaEvent event,
  ) async* {
    if (event is GetTriviaForConcreteNumber) {
      final inputEither =
          inputConverter.stringToUnsignedInteger(event.numberString);
      yield* inputEither.fold(
        (failure) async* {
          yield Error(message: INVALID_INPUT_FAILURE_MESSAGE);
        },
        (integer) async* {
          yield Loading();
          final failureOrTrivia =
              await getConcreteNumberTrivia(Params(number: integer));
          yield* _eitherLoadedOrerrorState(failureOrTrivia);
        },
      );
    } else if (event is GetTriviaForRandomNumber) {
      yield Loading();
      final failureOrTrivia = await getRandomNumberTrivia(NoParams());
      yield* _eitherLoadedOrerrorState(failureOrTrivia);
    }
  }

  Stream<NumberTriviaState> _eitherLoadedOrerrorState(
    Either<Failure, NumberTrivia> failureOrTrivia,
  ) async* {
    yield failureOrTrivia.fold(
      (failure) => Error(message: _mapFailureToMessage(failure)),
      (trivia) => Loaded(trivia: trivia),
    );
  }

  String _mapFailureToMessage(Failure failure) {
    switch (failure.runtimeType) {
      case ServerFailure:
        return SERVER_FAILURE_MESSAGE;
      case CacheFailure:
        return CACHE_FAILURE_MESSAGE;
      default:
        return 'Unexpected error';
    }
  }
}

我试过像这样添加对 super in 的调用:

  NumberTriviaBloc({
    @required GetConcreteNumberTrivia concrete,
    @required GetRandomNumberTrivia random,
    @required this.inputConverter,
  })  : assert(concrete != null),
        assert(random != null),
        assert(inputConverter != null),
        getConcreteNumberTrivia = concrete,
        getRandomNumberTrivia = random,
        super(Empty());

这修复了编译错误,但我不知道应该将什么传递给超级调用。

我对 Flutter 和 Dart 非常陌生(因为这是我第一次深入研究它们)。

感谢您能给我的任何见解。

标签: flutterdartbloc

解决方案


我不知道你用的是什么flutter bloc。
从 v5.0.0 开始设置初始状态有一个变化。
https://bloclibrary.dev/#/migration?id=%E2%9D%97initialstate-has-been-removed

所以你需要在超级构造函数中传递初始状态。


推荐阅读