在 Dart 的构造函数中初始化最终变量。两种方法,但只有一种有效? [复制]

Posted

技术标签:

【中文标题】在 Dart 的构造函数中初始化最终变量。两种方法,但只有一种有效? [复制]【英文标题】:Initialize a final variable in a constructor in Dart. Two ways but only one of them work? [duplicate] 【发布时间】: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;
    

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

谁能给我解释一下? 谢谢

【问题讨论】:

【参考方案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 上不起作用

以上是关于在 Dart 的构造函数中初始化最终变量。两种方法,但只有一种有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Dart入门—类与方法

在 dart 中覆盖类变量时出错

Flutter必备语言Dart教程03 - 类,泛型

Dart 工厂构造函数 - 它与“const”构造函数有何不同

在构造函数中初始化公共静态最终变量

Dart类(构造函数、单例)