Результат с экрана через pop в Flutter
Иногда после второго экрана нужно не только
вернуться назад, но и передать выбор:
имя, число, флаг. Второй экран вызывает
Navigator.pop(context, value) -
значение попадает в результат маршрута.
На первом экране Navigator.push
ожидают через await. Тип результата
задают у MaterialPageRoute,
например MaterialPageRoute<String>.
Если пользователь ушёл стрелкой без
выбора, результат будет null:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: PickColorPage()));
}
class PickColorPage extends StatefulWidget {
const PickColorPage({super.key});
@override
State<PickColorPage> createState() => _PickColorPageState();
}
class _PickColorPageState extends State<PickColorPage> {
String? chosen;
Future<void> openPicker() async {
final result = await Navigator.push<String>(
context,
MaterialPageRoute<String>(
builder: (context) => const ColorPickerScreen(),
),
);
if (!mounted) return; // skip setState if unmounted
setState(() {
chosen = result;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Color')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(chosen ?? 'No color selected'),
const SizedBox(height: 16),
ElevatedButton(
onPressed: openPicker,
child: const Text('Choose'),
),
],
),
),
);
}
}
class ColorPickerScreen extends StatelessWidget {
const ColorPickerScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Palette')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context, 'Teal');
},
child: const Text('Teal'),
),
),
);
}
}
Сделайте экран выбора города с тремя
TextButton.
По нажатию возвращайте название города
строкой. На главном показывайте
'City: ...' или подсказку, если
выбора не было.