如何初始化构造函数体中不可为null的成员



我已经用这种方式在Dart中创建了我的类,但我正在获得Non-nullable instance field 'text' must be initialized. Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.。我想知道是否有一种方法可以用"Python"风格来创建这种类,提前谢谢。

class Lexer {
String _text;
int _pos;
String _current_char;
Lexer(String text) {
this._text = text;
this._pos = -1;
this._current_char = '';
this.advance();
}
void advance() {
this._pos++;
this._current_char = this._pos < this._text.length ? this._text[this._pos] : '';
}
}
class Lexer {
String _text;
int _pos;
String _current_char;

这声明了几个类型为String的成员。由于它们被声明为String而不是String?,因此这些成员是不可为null的;它们不被允许是CCD_ 5。(这是Dart 2.12新的零安全功能的一部分。(

Dart分两个阶段初始化对象。当构造函数的主体运行时,Dart期望所有成员变量都已初始化。因为您的成员是不可为null的,并且还没有初始化为非null值,所以这是一个错误。错误消息解释了您可以做什么:

必须初始化不可为null的实例字段"text"。尝试添加初始值设定项表达式,或在此构造函数中添加字段初始值设定值设定项,或将其标记为"late"。

  • 使用初始值设定项表达式。这意味着使用初始值设定项列表:

    Lexer(String text)
    : _text = text,
    _pos = -1,
    _current_char = '' {
    advance();
    }
    

    请注意,如果使用相同名称的构造参数初始化成员,则可以使用缩写:

    Lexer(this._text)
    : _pos = -1,
    _current_char = '' {
    advance();
    }
    
  • 正在添加字段初始值设定项。这意味着初始化类声明中内联的成员。

    class Lexer {
    String _text = '';
    int _pos = -1,
    String _current_char = '';
    
  • 将您的成员标记为late。这意味着您承诺,在尝试使用变量之前,将对其进行初始化。

    class Lexer {
    late String _text;
    late int _pos,
    late String _current_char;
    
  • 使您的成员可以为null,这允许它们在默认情况下隐式为null:

    class Lexer {
    String? _text;
    int? _pos,
    String? _current_char;
    

    然而,这将要求所有访问在使用成员之前明确检查成员是否为null。

您可能还想阅读:Dart立即或在构造函数中为变量赋值?

最新更新