在dart和flutter代码中,通常在类的参数/实例变量之前声明构造函数,例如:
class Example {
// Constructor BEFORE parameters
Examples(this.name, this.profession);
final String name;
final String profession;
}
来自php,我习惯了不同的顺序,即:参数优先:
class Example {
final String name;
final String profession;
Examples(this.name, this.profession);
}
(据我所知,这也是用其他语言完成的,例如Java,Ruby,C#...)
在https://dart.dev/guides/language/effective-dart/style
的Dart编码风格指南中,没有解决此“现象”,而且到目前为止,我没有找到其他有关此现象的消息。
以下是“ Cloud Next '19”演示文稿中的示例,该文件由flutter核心开发人员提供:
https://youtu.be/RpQLFAFqMlw?t=1070
甚至通过flutter create
创建新的flutter项目时,您获得的现成计数器应用程序也使用以下顺序:
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();
}
有人知道,为什么Dart选择不同的方式?
答案 0 :(得分:5)
这只是flutter团队使用的一种样式约定,并记录在他们的style guide中。
做出此决定的主要原因是:
这有助于读者一目了然地确定类是否具有默认的隐式构造函数。
进一步
如果构造函数可能在类中的任何位置,那么读者将不得不检查类的每一行,以确定是否存在隐式构造函数。
对于其他元素,即成员,方法,静态字段等,在Flutter样式指南中没有明确的顺序:
类的方法,属性和其他成员应按顺序排列,以帮助读者理解类的工作原理。
但是,如果没有明显的顺序,则样式指南会建议以下内容:
- 构造函数,默认构造函数优先。
与类相同类型的常量。
返回与类相同类型的静态方法。
从构造函数设置的最终字段。
其他静态方法。
静态属性和常量。
可变属性,每个属性依次为:getter,私有字段,setter, 没有换行符分隔它们。
只读属性(hashCode除外)。
运算符(==除外)。
方法(除了toString和build)。
用于Widget和State类的构建方法。
operator ==,hashCode,toString和与诊断相关的方法,位于 那个顺序。
所有引号直接来自style guide。
答案 1 :(得分:2)
关于构造函数,Flutter样式指南不同于Dart style guide这两个指南,否则它们有很多共同之处。因此,尽管Dart的样式指南的确没有提及“构造函数优先”之类的内容,也没有任何代码示例给人这种建议的印象,但Flutter提出了自己的样式指南,正如DaGardner之前提到并链接到的一样。这样做的原因是,有些小部件的参数非常庞大,似乎有些杂乱无章。
进一步的讨论可以在下面找到: https://github.com/flutter/flutter/issues/1220 https://github.com/dart-lang/linter/issues/186