Тернарный оператор в дереве виджетов в Flutter
Когда нужно подставить один из двух виджетов
на одно место, удобен тернарный оператор
условие ? виджетA : виджетB. Он
работает как выражение: результат можно
передать в child, положить в список
children или вернуть из короткого
фрагмента build. Логика та же, что
у if-else в build,
но запись компактнее:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: HomePage()));
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
const isDark = false;
return Scaffold(
body: Center(
child: isDark
? const Icon(Icons.nightlight_round)
: const Icon(Icons.wb_sunny),
),
);
}
}
Обе ветки должны иметь тип Widget
(или общий предок). Перед виджетами ставьте
const, если все аргументы константные.
Вложенный тернарный оператор для трёх и больше
вариантов нечитаем - берите if-else
или переменную с switch.
Для различия текста достаточно сменить
строку или иконку в одном Center:
Widget build(BuildContext context) {
const isDone = true;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Status'),
const SizedBox(height: 8),
isDone
? const Text('Done')
: const Text('In progress'),
],
);
}
В body выведите подпись тернарным
выбором:
const premium = false;
Center(
child: Text(premium ? 'Premium' : 'Free plan'),
)
Поменяйте premium на true
и проверьте вторую подпись.