【问题标题】:Initialize a final variable in a constructor in Dart. Two ways but only one of them work? [duplicate]在 Dart 的构造函数中初始化最终变量。两种方法,但只有一种有效? [复制]
【发布时间】:2021-12-19 20:42:17
【问题描述】:

我正在尝试理解以下示例,其中我尝试在构造函数中初始化最终变量。

第一个例子 - 工作

void main() {
  
  Test example = new Test(1,2);
  
  print(example.a);  //print gives 1
    
}

class Test
{
  final int a;
  int b;

    Test(this.a, this.b);
}

第二个例子不起作用

void main() {
  
  Test example = new Test(1,2);
  
  print(example.a);  //compiler throws an error
    
}

class Test
{
  final int a;
  int b;

    Test(int a, int b){
      this.a = a;
      this.b = b;
    }
}

当我删除 final 然后它再次工作

void main() {
  
  Test example = new Test(1,2);
  
  print(example.a);  //print gives 1
    
}

class Test
{
  int a;
  int b;

    Test(int a, int b){
      this.a = a;
      this.b = b;
    }
}

第一个和第二个构造函数中的构造函数有什么区别,为什么最终初始化适用于第一个而不适用于第二个。

谁能给我解释一下? 谢谢

【问题讨论】:

    标签: flutter dart constructor initialization final


    【解决方案1】:

    您不能在构造函数主体中实例化最终字段。

    实例变量可以是最终的,在这种情况下,它们必须只设置一次。在声明时、使用构造函数参数或使用构造函数的初始化器列表初始化最终的非后期实例变量:

    通过创建一个同名的函数来声明一个构造函数 它的类(加上,可选地,附加标识符,如 命名构造函数)。最常见的构造函数形式 生成构造函数,创建一个类的新实例

    构造函数中的语法(在https://www.dartlang.org/guides/language/language-tour#constructors 中描述):

    【讨论】:

    • 首先感谢您的回答。但是如果你在 dartpad 中尝试上面的代码,你会发现它是有效的。还是我做错了什么?
    • 我得到了这个:编译到 JavaScript 时出错:/tmp/dartpadREEHUS/lib/bootstrap.dart:警告:将其解释为包 URI,'package:dartpad_sample/bootstrap.dart'。 /tmp/dartpadREEHUS/lib/main.dart:15:7:错误:字段“a”应该被初始化,因为它的类型“int”不允许为空。诠释一个; ^ /tmp/dartpadREEHUS/lib/main.dart:16:7:错误:字段“b”应该被初始化,因为它的类型“int”不允许为空。诠释 b; ^
    • 它在 dartpad 上不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2022-11-23
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多