跳到主要内容

multiple_super_initializers

一个构造函数最多只能有一个 'super' 初始化器。

描述

#

当构造函数的初始化列表包含对超类中多个构造函数的调用时,分析器会产生此诊断信息。初始化列表必须且只能包含一个这样的调用,它可以是显式的或隐式的。

示例

#

以下代码会产生此诊断信息,因为类 B 的构造函数的初始化列表同时调用了超类 A 中的 onetwo 构造函数

dart
class A {
  int? x;
  String? s;
  A.one(this.x);
  A.two(this.s);
}

class B extends A {
  B() : super.one(0), super.two('');
}

常见修复方法

#

如果其中一个超类构造函数可以完整初始化实例,则移除另一个

dart
class A {
  int? x;
  String? s;
  A.one(this.x);
  A.two(this.s);
}

class B extends A {
  B() : super.one(0);
}

如果其中一个超类构造函数实现的初始化可以在构造函数体中完成,则移除其 super 调用,并在构造函数体中执行初始化

dart
class A {
  int? x;
  String? s;
  A.one(this.x);
  A.two(this.s);
}

class B extends A {
  B() : super.one(0) {
    s = '';
  }
}

如果初始化只能在超类中的构造函数中执行,则要么添加一个新的构造函数,要么修改现有构造函数之一,以便存在一个允许在单次调用中完成所有必需初始化的构造函数

dart
class A {
  int? x;
  String? s;
  A.one(this.x);
  A.two(this.s);
  A.three(this.x, this.s);
}

class B extends A {
  B() : super.three(0, '');
}