Dart 飞奔延迟初始化最终变量

Dart 飞奔延迟初始化最终变量,dart,Dart,是否有办法延迟初始化最终变量。问题是许多值都是用类的入口点初始化的,而类不是构造函数。因此,它们现在不可能是最终的。但在特定类别的范围内,它们不会改变。例如 Controller controller; double width; void setup(final itemWidth) { controller = MyController(); width = itemWidth; } 可能吗?现在我看到的唯一解决方案是注释。你可能认为这是为了视觉效果。但

是否有办法延迟初始化最终变量。问题是许多值都是用类的入口点初始化的,而类不是构造函数。因此,它们现在不可能是最终的。但在特定类别的范围内,它们不会改变。例如

  Controller controller;
  double width;

  void setup(final itemWidth) {
    controller =  MyController();
    width = itemWidth;
  }

可能吗?现在我看到的唯一解决方案是注释。你可能认为这是为了视觉效果。但事实上,它有助于避免在测试期间出现不可预测的流

不,这是不可能的。您最多只能使用构造函数初始值设定项

我不确定我是否理解您的问题,因为您的示例可以很容易地写成:

class Controller {}
class MyController implements Controller {}

class MyClass {
  final Controller controller;
  final double width;

  MyClass(this.width) : controller = MyController();
}

您能提供一个更好的例子来说明您的问题吗?

现在可以延迟初始化变量。有关更多信息,请参阅。值得一提的是,该功能仍处于测试阶段,在迁移应用程序之前,您应该等待null safety处于稳定版本中。下面的文本是从Dart的文档中复制的:

后期最终变量 您还可以将late与final结合使用:

//使用空安全性:
课堂咖啡{
后期最终管柱温度;
无效热(){u温度='hot';}
空冷()
字符串serve()=>_温度+‘咖啡’;
}

与普通的final字段不同,您不必在其声明或构造函数初始化列表中初始化字段。您可以稍后在运行时分配给它。但是您只能为它分配一次,并且在运行时检查该事实。如果您尝试多次分配给它(如在此处同时调用
heat()
chill()
),则第二次分配会引发异常。这是一种很好的建模状态的方法,它最终会被初始化,之后是不可变的。

\feelsbadman。但你的看法是什么。它真的有意义吗?你的意思是它有意义吗?它是不可能的还是最终的?Doe有一些内部语言来处理这种情况是有意义的。例如“lateinit最终值…”?我从来没有使用过这样的构造。构造函数赋值已经足够了,如果您需要一些计算工厂模式,现在就可以了。看答案你们并没有得到问题。我说我不想使用构造函数。下面的答案是正确的。“我说过不想使用构造函数。”当构造函数显然是您所需要的时,您需要激发这一点。延迟初始化不是一个罕见的概念,许多语言(如Kotlin和Swift)都支持它。假设您有一个对象列表。列表中的每个对象还需要对右侧和左侧的对象进行引用。他们的参考资料不会改变,所以将其标记为最终版本是有意义的。但是你不能在构造器中分配它们,因为相邻对象之间存在周期性的依赖关系。更多关于
后期最终
初始化的文档-与普通最终字段不同,您不必在其声明或构造函数初始化列表中初始化字段。您可以稍后在运行时分配给它。但您只能为它分配一次,并且在运行时检查该事实。如果您多次尝试为它赋值,比如在这里同时调用heat()和chill(),那么第二次赋值将抛出一个异常。这是一种很好的建模方法,它可以对最终初始化的状态进行建模,并且在之后是不可变的。如何检查_温度变量是否已初始化?请建议。谢谢