考虑下面的代码:

class Person {
  String id;
  String name;
  ConnectionFactory connectionFactory;

  // What is this constructor doing?
  Person({this.connectionFactory: _newDBConnection});

}

如果在构造函数的参数前面加上this,相应的字段将自动初始化,但为什么是{...}呢?

推荐答案

这使该参数成为命名的可选参数.

当你实例化一个Person,你可以

Person p;
p = new Person(); // default is _newDbConnection
p = new Person(connectionFactory: aConnectionFactoryInstance);
  • 如果没有{},参数将是必需的
  • 对于[],该参数将是可选的位置参数
// Constructor with positional optional argument
Person([this.connectionFactory = _newDBconnection]);
...
Person p;
p = new Person(); // same as above
p = new Person(aConnectionFactoryInstance); // you don't specify the parameter name

命名的可选参数对于布尔参数非常方便(当然,对于其他情况也是如此).

p = new Person(isAlive: true, isAdult: false, hasCar: false); 

这些参数类型的使用有一个特定的顺序:

  1. 强制(位置)参数(只有位置参数可以是强制的)
  2. 可选位置参数
  3. (可选)命名参数(命名参数始终是可选的)

请注意,位置和命名可选参数使用不同的分隔符作为默认值.

从DART 2开始支持=作为分隔符,并且根据样式指南首选,同时仍然支持:.

另请参阅:

Dart相关问答推荐

Dart 中 ThemeData 类的 copyWith() 方法

在 Flutter 中以间隔自动获取 API 数据

AppLifcycleState.didChangeLifecycleState( ) 函数在应用程序进入前台或后台时不被调用

在 Dart/Flutter 中创建 DateTime 对象时如何指定 TimeZone?

Bad state:在Flutter中从 addStream 添加项目时,您无法关闭主题

结合freezed和hive

Stack inside Stack in flutter

如何调整ShowDialog的子级大小

Firebase Crashlytics 崩溃未报告给 Flutter 中的 Firebase 控制台

Flutter ToggleButton 类 - Flutter 1.9.1

如何使用 Dart 动态加载 HTML 并插入我的网页?

Flutter:主题未应用于文本小部件

如何将整数中的ascii值转换为Flutter中的等效字符?

Dart 语法高亮不是高亮 dart 代码

为什么 Angular 在组件名称中不需要破折号

如何创建类型别名

从 Dart 调用 javascript

多次打印同一个字符而不循环

dart列表最小值/最大值

什么是 ?? Dart 中的双问号?