什么是 Dart Flutter 中的零参数构造函数

Jav*_*haq 3 dart flutter bloc

Dart Flutter 中的零参数构造函数是什么?

在颤振中创建一个块时,我收到以下错误

  The superclass 'Bloc<QuoteEvent, QuoteState>' doesn't have a zero argument constructor.
Try declaring a zero argument constructor in 'Bloc<QuoteEvent, QuoteState>', or explicitly invoking a different constructor in 'Bloc<QuoteEvent, QuoteState>'.
Run Code Online (Sandbox Code Playgroud)

请指导如何修复它。谢谢

下面是代码

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

import 'package:random_quote/repositories/repositories.dart';
import 'package:random_quote/models/models.dart';
import 'package:random_quote/bloc/bloc.dart';

class QuoteBloc extends Bloc<QuoteEvent, QuoteState> {
  final QuoteRepository repository;

  QuoteBloc({@required this.repository}) : assert(repository != null);

  @override
  QuoteState get initialState => QuoteEmpty();

  @override
  Stream<QuoteState> mapEventToState(QuoteEvent event) async* {
    if (event is FetchQuote) {
      yield QuoteLoading();
      try {
        final Quote quote = await repository.fetchQuote();
        yield QuoteLoaded(quote: quote);
      } catch (_) {
        yield QuoteError();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Mol*_*0ko 5

initialStatev5.0.0以来,属性已从flutter_bloc 中删除。这是迁移指南

您应该改用 super() 构造函数:

class QuoteBloc extends Bloc<QuoteEvent, QuoteState> {
  final QuoteRepository repository;

  QuoteBloc({@required this.repository}) : 
    assert(this.repository != null),
    super(QuoteEmpty());

  ...
Run Code Online (Sandbox Code Playgroud)


jam*_*lin 3

零参数构造函数实际上是可以用零参数调用的构造函数。这包括仅采用可选参数的构造函数。

如果派生类没有显式调用其基类构造函数,则派生类的构造函数将隐式调用基类中带有零参数的默认(未命名)构造函数。如果需要调用基类中的命名构造函数或者需要传递参数,则需要显式调用基类构造函数。

在您的情况下,QuoteBloc派生自Bloc<QuoteEvent, QuoteState>,但QuoteBloc构造函数不会显式调用来自 的任何构造函数Bloc,这显然不提供默认的零参数构造函数。