包装构造函数参数的花括号表示什么?

Bar*_*ski 27 dart

考虑以下代码:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

Gün*_*uer 29

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

当你实例化Person你可以

Person p;
p = new Person(); // default is _newDbConnection
p = new Person(connectionFactory: aConnectionFactoryInstance);
Run Code Online (Sandbox Code Playgroud)
  • 没有{}参数将是强制性的
  • []参数将是一个可选的位置参数
// 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
Run Code Online (Sandbox Code Playgroud)

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

p = new Person(isAlive: true, isAdult: false, hasCar: false); 
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,位置和命名可选参数对默认值使用不同的分隔符.命名需要:但位置要求=.语言设计者认为冒号更符合Map文字语法(我至少会对两者使用相同的分隔符).

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

也可以看看:

  • 你应该更新这个答案。现在,命名参数可以并且应该使用 `=` 指定,根据以下警告:["弃用说明:旧代码可能使用冒号 (:) 而不是 = 来设置命名参数的默认值。原因是最初,仅 : 支持命名参数。该支持可能会被弃用,因此我们建议您使用 = 指定默认值。"](https://www.dartlang.org/guides/language/language-tour#可选位置参数) (2认同)

X. *_*ang 13

Dart 函数允许使用位置参数命名参数以及可选的位置命名参数,或者它们的组合

位置参数简单无装饰:

void debugger(String message, int lineNum) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

命名参数意味着当你调用一个函数时,你将参数附​​加到一个标签上。此示例调用具有两个命名参数的函数:

debugger(message: 'A bug!', lineNum: 44);
Run Code Online (Sandbox Code Playgroud)

命名参数的写法略有不同。将任何命名参数括在花括号中({ })。这一行定义了一个带有命名参数的函数:

void debugger({String message, int lineNum}) { 
Run Code Online (Sandbox Code Playgroud)

默认情况下,命名参数是可选的。但是您可以对它们进行注释并使它们成为必需:

Widget build({@required Widget child}) { 
  //... 
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以传递可选的位置参数,使用[ ]

int addSomeNums(int x, int y, [int z]) {
  int sum = x + y;
  if (z != null) {
    sum += z;
  }
  return sum;
}
Run Code Online (Sandbox Code Playgroud)

您可以这样调用该函数:

addSomeNums(5, 4) 
addSomeNums(5, 4, 3)
Run Code Online (Sandbox Code Playgroud)

您可以使用=函数签名中的运算符为参数定义默认值,该函数可以简化如下:

addSomeNums(int x, int y, [int z = 5]) => x + y + z;
Run Code Online (Sandbox Code Playgroud)