Что такое именованные параметры в Dart?

«Что такое именованные параметры в Dart?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Именованные параметры в Dart — это параметры функции, которые передаются по имени при вызове. Они объявляются в фигурных скобках {} в сигнатуре функции и делают вызовы более читаемыми и гибкими, особенно когда функция имеет много необязательных параметров.

Ключевые особенности:

  • Читаемость: Имена параметров явно указывают их назначение.
  • Порядок не важен: Параметры можно передавать в любом порядке.
  • Необязательность: По умолчанию все именованные параметры необязательны. Чтобы сделать их обязательными, используется модификатор required (начиная с Dart 2.12).
  • Значения по умолчанию: Можно задавать значения по умолчанию с помощью =.

Примеры:

// 1. Базовый пример с необязательными параметрами
void configureApp({String? theme, bool darkMode = false, int retryCount}) {
  print('Theme: $theme, DarkMode: $darkMode, Retries: $retryCount');
}

// 2. Обязательные именованные параметры с `required`
void greetUser({required String name, String greeting = 'Hello'}) {
  print('$greeting, $name!');
}

// 3. Комбинация позиционных и именованных параметров
// Позиционные идут первыми, затем именованные.
void launchRocket(String missionName, {double fuelLevel = 100.0, bool abortOnWarning = false}) {
  print('Launching $missionName with $fuelLevel% fuel.');
}

void main() {
  // Вызов с именованными параметрами (порядок произвольный)
  configureApp(darkMode: true, theme: 'Material3', retryCount: 3);
  configureApp(retryCount: 1); // theme и darkMode используют значения по умолчанию

  // Вызов с обязательным параметром
  greetUser(name: 'Alice'); // Hello, Alice!
  greetUser(greeting: 'Hi', name: 'Bob'); // Hi, Bob!
  // greetUser(); // Ошибка компиляции: 'name' is required.

  // Комбинированный вызов
  launchRocket('Artemis I', fuelLevel: 95.5);
}

Практическое применение в Flutter: Именованные параметры широко используются в API Flutter для конфигурации виджетов, что делает код построения UI чрезвычайно декларативным и понятным.

// Конструктор Text имеет множество именованных параметров
Text(
  'Hello Flutter',
  style: TextStyle(fontSize: 24, color: Colors.blue),
  textAlign: TextAlign.center,
  overflow: TextOverflow.ellipsis,
)

// Конструктор ElevatedButton
ElevatedButton(
  onPressed: () {},
  style: ElevatedButton.styleFrom(backgroundColor: Colors.green),
  child: Text('Submit'),
)