Ответ
Именованные параметры в 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'),
)