Что представляют собой фигурные скобки, обертывающие аргументы конструктора?

Рассмотрим следующий фрагмент кода:

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

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

}

Если вы предшествуете аргументу конструктора с this, соответствующее поле будет автоматически инициализировано, но почему {...}?

Ответ 1

Это делает аргумент именованным необязательным аргументом.

Когда вы создаете экземпляр 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. (необязательно) именованные аргументы (именованные аргументы всегда необязательны)

Обратите внимание, что позиционные и именованные необязательные аргументы используют разные разделители для значения по умолчанию. Именованный требует : но позиционный требует =. Разработчики языка утверждают, что двоеточие лучше подходит для литерального синтаксиса Map (я бы по крайней мере использовал один и тот же разделитель для обоих).

= поддерживается как разделитель начиная с Dart 2 и предпочтительнее в соответствии с руководством по стилю, а : все еще поддерживается.

Смотрите также:

Ответ 2

this. connectionFactory this. connectionFactory в

Person({this.connectionFactory: _newDBConnection});

называется Автоматическая инициализация переменной члена класса. Смотрите этот пример