【发布时间】:2019-02-02 23:29:46
【问题描述】:
在 Flutter 中,用一个例子可以清楚地解释什么?
我的困惑是关于key,如下面的代码所示。
MyHomepage({Key key, this.title}) : super(key: key);
【问题讨论】:
-
你能解释一下你不明白的地方吗?
在 Flutter 中,用一个例子可以清楚地解释什么?
我的困惑是关于key,如下面的代码所示。
MyHomepage({Key key, this.title}) : super(key: key);
【问题讨论】:
代码是MyHomepage小部件的构造函数。
{Key key, this.title}
它声明了两个可选的命名参数(可选的命名是因为{}),其中
第一个名称为key,类型为Key
第二个是名称title,字段类型为this.title,并使用传递的值自动初始化this.title。这是一个很好的语法糖,可以节省一些写作时间。
: 启动初始化列表。
初始化列表允许一些人在调用被转发到超类的构造函数之前执行一些表达式。
当一个类被初始化时,对this的读访问被禁止,直到对超级构造函数的调用完成(直到构造函数的主体被执行——在你的例子中,构造函数没有主体)。
初始化器列表通常用于使用assert(key != null) 验证传递的参数值或使用计算值初始化final 字段(final 字段不能在以后初始化或更新)。
super(key: key) 转发给超类的构造函数,并将传递给MyHomepage 的参数key 传递给超构造函数key 参数(与MyHomepage({Key key}) 相同)。
【讨论】:
感谢Günter's detailed explanation 一开始就帮助了我。在这里我想解释一下这个问题的背景,尤其是作为语法的标点符号。
上面提到的那行代码,
MyHomepage({Key key, this.title}) : super(key: key);
应该来自自动生成的Flutter application boilerplate。
完整的上下文是:
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
对我来说,奇怪的标点符号(大括号{ } 和两个冒号:)让我无法理解它的语法。
花括号 of {Key key, this.title}: 是在 Dart 中定义函数时声明可选参数的语法。
MyHomepage(...) : super(key: key)的第一个冒号是一个分隔符,指定构造函数MyHomepage(...)的初始化列表(super(key: key))
super(key: key) 中的第二个冒号是您将参数传递给命名函数(在本例中为super())的方式)。
enableFlags定义如下void enableFlags({bool bold, bool hidden}) {...}
value 之前声明parameterName,用冒号: 分隔,这对于开发人员来说比Pythonic 方式更安全。 Swift 中的对应语法应该是外部参数。
enableFlags(bold: true, hidden: false);
我希望这能有所帮助。
所有定义和示例都可以在 Dart 的official document 中找到。
【讨论】:
{Key key, this.title} 是声明命名参数而不是可选参数的语法(当然命名参数默认是可选的)。我感到困惑的是在命名参数声明中使用this.title。据我了解,此语法声明了一个名为 title 的参数,并使用为 title 参数传递的值初始化对象的 title 属性。
Flutter 在框架内的很多事情上都使用了 Key。由于您的小部件扩展了 StatelessWidget 或 StatefulWidget,这是您的小部件具有密钥的方式,以便框架知道如何处理它(超级函数将密钥传递给超类小部件 - 框架可以理解)。
除此之外只有 Dart 语法(顺便说一句,这很棒)。
您可以在此处了解有关 Keys 的更多信息:https://www.youtube.com/watch?v=kn0EOS-ZiIc
另一个例子是测试框架。 Flutter 驱动程序需要一个密钥来知道要查找哪个小部件并与之交互。使用这种语法,您的小部件将有一个键,它会工作!
【讨论】: