【问题标题】:How to fix this Flutter error: The superclass 'Bloc<NumberTriviaEvent, NumberTriviaState>' doesn't have a zero argument constructor如何修复此 Flutter 错误:超类 'Bloc<NumberTriviaEvent, NumberTriviaState>' 没有零参数构造函数
【发布时间】:2021-08-01 20:56:07
【问题描述】:

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

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

我收到此错误:

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

这是代码的相关部分:

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 非常陌生(因为这是我第一次深入了解它们)。

感谢您提供的任何见解。

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    嘿,我在学习本教程后也遇到了同样的问题,答案很简单。 您所要做的就是将 InitialNumberTriviaState() 传递给 bloc 的超级构造函数 -

    import 'dart:async';
    import 'package:bloc/bloc.dart';
    import './bloc.dart';
    
    class NumberTriviaBloc extends Bloc<NumberTriviaEvent, NumberTriviaState> {
      NumberTriviaBloc() : super(InitialNumberTriviaState());
    
      @override
      Stream<NumberTriviaState> mapEventToState(
        NumberTriviaEvent event,
      ) async* {
        // TODO: Add Logic
      }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,它是flutter_bloc 7.0.0,所以这个变化是突破性的变化。请参阅上面我对 Corxx5f 的回复。
      【解决方案3】:

      TLDR 你应该传递你的集团的初始状态。

      请参阅官方文档,问题在于 initialState 现在已传递给 super 而不是您必须覆盖的属性。

      查看他们docs 的这个例子,因为状态是int 类型,初始状态是 0 并被传递给超类。

      class CounterCubit extends Cubit<int> {
        CounterCubit() : super(0);
      
        void increment() => emit(state + 1);
        void decrement() => emit(state - 1);
      }
      

      您还可以将Cubit 用于更简单的用例而不是完整的块。

      【讨论】:

      • 谢谢,所以通过将 Empty() 传递给 super 是正确的方法(因为 Empty() 是初始状态?
      • 哦,还有这一行: NumberTriviaState get initialState => Empty();不再需要?
      • 是的 FrankCazabon,你是对的,@KuKu 指出了 bloc 库引入重大更改的确切版本
      猜你喜欢
      • 2021-04-17
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2021-04-08
      • 2020-09-26
      • 2018-12-06
      • 1970-01-01
      相关资源
      最近更新 更多