我已经以这种方式在 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] : '';
}
}
Run Code Online (Sandbox Code Playgroud)
class Lexer {
String _text;
int _pos;
String _current_char;
Run Code Online (Sandbox Code Playgroud)
这声明了几个具有 type 的成员String。由于它们被声明为 asString而不是 as String?,这些成员是不可为空的;他们永远不被允许null。(这是 Dart 2.12 新的空安全特性的一部分。)
Dart 分两个阶段初始化对象。当构造函数的主体运行时,Dart 期望所有成员变量都已经初始化。因为您的成员不可为空并且尚未初始化为非空值,所以这是一个错误。错误消息说明了您可以执行的操作:
不可为空的实例字段 'text' 必须被初始化。尝试添加初始化表达式,或在此构造函数中添加字段初始化器,或将其标记为“迟到”。
使用初始化表达式。这意味着使用初始化列表:
Lexer(String text)
: _text = text,
_pos = -1,
_current_char = '' {
advance();
}
Run Code Online (Sandbox Code Playgroud)
添加字段初始值设定项。这意味着在类声明中内联初始化成员。
class Lexer {
String _text = '';
int _pos = -1,
String _current_char = '';
Run Code Online (Sandbox Code Playgroud)
将您的成员标记为late. 这意味着您承诺在任何尝试使用它们之前将初始化这些变量。
class Lexer {
late String _text;
late int _pos,
late String _current_char;
Run Code Online (Sandbox Code Playgroud)
使您的成员可以为空,默认情况下允许它们隐式为空:
class Lexer {
String? _text;
int? _pos,
String? _current_char;
Run Code Online (Sandbox Code Playgroud)
但是,我不建议这样做,因为这将要求所有访问在使用之前明确检查成员是否为空。
您可能还想阅读:Dart 立即分配给变量还是在构造函数中?
| 归档时间: |
|
| 查看次数: |
2233 次 |
| 最近记录: |