В Dart необязательные параметры могут быть определены с помощью квадратных скобок [ ], чтобы компилятор знал, что эти параметры являются необязательными.

Здесь [Строка? необязательный] — необязательный параметр. Также обратите внимание, что всякий раз, когда у вас есть необязательный параметр, он всегда может быть null.

myFunction теперь можно правильно выполнить, передав только 1 параметр value. Второй, необязательный, совершенно необязательный, конечно, и его значение будет null, если ничего не передано.

void main() {
  myFunction('hello');
  // Value: hello
  // Optional: null
}

void myFunction(String value, [String? optional]) {
  print('Value: $value');
  print('Optional: $optional');
}

Мы также можем указать другой способ объявления необязательного параметра, используя необязательный именованный параметр. Именованные параметры либо обязательны, то есть они должны иметь значения, либо необязательны, то есть необязательны.

Объявление именованного параметра делается просто так:

// number here is optional and is also marked nullable.
// text is of course required, and cannot ever be null since it is declared as String
void myNamedParameterFunction({ required String text, int? number }) {
  print('Text: $text');
  print('Number: $number');
}

void main() {
  myNamedParameterFunction(text: 'hello');
}

Выше текст объявлен как параметр имени со значением String 'hello'. Число, конечно, совершенно необязательно, потому что оно может быть нулевым.

Если бы мы захотели, мы могли бы объявить число как имеющее значение по умолчанию, чтобы оно никогда не было нулевым.

// Here number is optional but will also never be null.
// It will always default to 0;
void myNamedParameterFunction({ required String text, int number = 0 }) {
  print('Text: $text');
  print('Number: $number');
}

Спасибо за прочтение! 😎👋🏽