【问题标题】:Understanding Dart/Flutter Constructors with final Variables [duplicate]了解具有最终变量的 Dart/Flutter 构造函数 [重复]
【发布时间】:2021-07-24 04:43:40
【问题描述】:

这段代码sn-p

class SomeWidget extends StatelessWidget {
final String aString;

SomeWidget(this.aString);

编译没有错误或警告。不过这段代码sn -p

class SomeWidget extends StatelessWidget {
final String aString;

SomeWidget(String inputString) {
    this.aString=inputString;
}

给出一个错误信息,所有的 final 变量都必须被初始化而 aString 不是,并且 aString 不能被用作一个 setter,因为它是 final 的。删除 final 关键字会消除错误消息。

我不清楚这里发生了什么。我看到了thisthis SO 项目,但老实说,我仍然难以理解。我认为对我来说,问题源于我是如何被教导我的两个代码 sn-ps 在功能上相同的。

【问题讨论】:

  • 请解释不清楚的地方。你的两个相关问题有很好的解释,你没有说你的理解在哪里下降。
  • 这是一个比人们想象的更难的问题,但据我了解,我不知道这两个 sn-ps 会发生什么不同。我被教导第一个是写第二个更短,更方便的方式。但显然它们并不相同。
  • 第一个 sn-p 与使用链接问题中显示的初始化列表相同。如果你指的是学习 Dart 以外的语言,你不应该假设它们之间的任何东西都是相同的。毕竟它们是不同的语言。
  • 感谢您的耐心等待。说我们几乎必须在 Dart 中使用带有 final 属性的第一个 sn-p 语法是否准确?
  • 你也可以使用初始化列表。除此之外,初始化最终变量的唯一方法是在其声明的同一行进行。

标签: flutter dart constructor


【解决方案1】:

当你将一个变量声明为final时,这意味着这个变量的状态\值在这个小部件的生命周期内不会改变。

因此,当您声明时:

final String aString;

你告诉框架,aString 的值不会改变,因为它是最终的。然而,当你使用 setter 时,你正试图做与你刚刚承诺的 Flutter 完全相反的事情,你正试图改变应该是 final = aka non-changeable。

【讨论】:

  • 那么当setter行代码即将执行时,aString的值是多少?什么时候给它赋值? [感谢您的回复]
  • 它的初始化有两种方式,要么是你第一次声明它aString = "some value",要么你写代码的时候不知道它会是什么,但是应用程序会在以后确定,你使用你的第一个 sn-p SomeWidget(this.aString);。现在在你的代码中,每当你想插入SomeWidget,它会告诉你有一个你没有添加的必需字符串,然后你使用SomeWidget("userName")。如果它是最终的,这些是可以分配 aString 的值的方式。
猜你喜欢
  • 2020-10-30
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2021-12-19
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多