Условие if-else в методе build в Flutter
Метод build у StatelessWidget
должен вернуть один виджет. Иногда
экран или фрагмент зависит от условия:
показать приветствие или заглушку. В Dart
внутри build можно использовать
if и else и в каждой ветке
вернуть свой виджет - как в
учебнике Dart,
только результатом будет не число, а дерево
интерфейса.
Пока состояние не меняется во время работы
приложения, достаточно локальной или поля
класса: final или const
флаг, строка режима, результат проверки.
После hot reload изменение константы в коде
перерисует экран; интерактивное переключение
разберём, когда изучим setState:
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 userLoggedIn = false;
if (userLoggedIn) {
return Scaffold(
body: Center(child: Text('Account')),
);
} else {
return Scaffold(
body: Center(child: Text('Sign in')),
);
}
}
}
Ветки должны возвращать совместимые по смыслу
корни - чаще оба раза Scaffold
с разным body. Условие может стоять
и внутри одного Scaffold, если меняется
только содержимое body, но отдельные
return наглядны для двух полностью
разных экранов:
Widget build(BuildContext context) {
const isEmpty = true;
Widget body;
if (isEmpty) {
body = const Center(child: Text('The list is empty'));
} else {
body = ListView(
children: const [Text('Item')],
);
}
return Scaffold(body: body);
}
В build выберите экран так:
const showError = true;
if (showError) {
return const Scaffold(
body: Center(child: Text('Load error')),
);
}
return const Scaffold(
body: Center(child: Text('Data is here')),
);
Переключите константу и перезапустите preview, чтобы увидеть второй вариант.