【问题标题】:How do I initialize non-nullable members in a constructor body?如何在构造函数主体中初始化不可为空的成员?
【发布时间】:2021-06-17 21:23:54
【问题描述】:

我已经以这种方式在 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] : '';
  }
}

【问题讨论】:

  • 我正在将这个问题的标题从“如何在 Dart 中创建类似 Python 的类?”不那么模糊,更容易搜索。

标签: dart


【解决方案1】:
class Lexer {
  String _text;
  int _pos;
  String _current_char;

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

Dart initializes objects in two phases。当构造函数的 body 运行时,Dart 期望所有成员变量都已经初始化。因为您的成员不可为空并且尚未初始化为非空值,所以这是一个错误。错误消息说明了您可以执行的操作:

必须初始化不可为空的实例字段“文本”。尝试添加初始化表达式,或在此构造函数中添加字段初始化,或将其标记为“延迟”。

  • 使用初始化表达式。这意味着使用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。这意味着您承诺变量将在任何尝试使用它们之前被初始化。

    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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2011-05-02
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多