gpt4 book ai didi

dart - 如何在构造函数主体中初始化不可为 null 的成员?

转载 作者:行者123 更新时间:2023-12-05 08:14:47 24 4
gpt4 key购买 nike

我已经以这种方式在 Dart 中创建了我的类,但我得到了 Non-nullable instance field 'text' must be initialized。尝试添加一个初始化表达式,或在此构造函数中添加一个字段初始化器,或将其标记为“晚”。我想知道是否有一种方法可以在创建此类的“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。 (这是 Dart 2.12 中新的空安全特性的一部分。)

Dart initializes objects in two phases .当构造函数的 body 运行时,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'.

  • 使用初始化表达式。这意味着使用 initializer list :

    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 = '';
  • Marking your members as late .这意味着您 promise 变量将在任何尝试使用它们之前被初始化。

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

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

    但是,这将要求所有访问在使用之前明确检查成员不为空。

您可能还想阅读:Dart assigning to variable right away or in constructor?

关于dart - 如何在构造函数主体中初始化不可为 null 的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66725613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com