我已经用这种方式在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立即或在构造函数中为变量赋值?