Получите результат обратно
Часть раздела Списки и экраны путешествия по Flutter на Coddy. Урок 22 из 33.
Некоторые экраны нужны, чтобы задать вопрос: выбрать цвет, выбрать дату. Ответ должен вернуться на экран, который задал вопрос. Navigator.pop может передать его:
Navigator.pop(context, 'Green');С другой стороны, Navigator.push возвращает Future: значение, которое приходит позже, когда экран, добавленный в стек, закрывается. await ожидает его, а функция, которая его ожидает, помечена как async:
onPressed: () async {
final String? color = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ColorScreen()),
);
if (color != null) {
setState(() {
chosen = color;
});
}
},Результат имеет тип String?: когда пользователь уходит с помощью стрелки «Назад», ничего не передаётся, и color равен null. В этом случае if сохраняет прежний выбор. В одном из следующих разделов будет подробно рассказано о Future и await.
Задание
СреднеПри выборе цвета экран выбора закрывается, но главный экран об этом не узнаёт. Верни выбранный цвет обратно:
- на экране выбора цвета выполни pop, передав цвет:
Navigator.pop(context, color) - на главном экране выполни
awaitдля push и, если цвет вернулся, покажиYour color: Green(с выбранным цветом) - если выйти с помощью стрелки назад, старый текст останется
Попробуйте сами
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
String chosen = 'none';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Paint')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Your color: $chosen', style: const TextStyle(fontSize: 24)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ColorScreen()),
);
},
child: const Text('Choose a color'),
),
],
),
),
);
}
}
class ColorScreen extends StatelessWidget {
const ColorScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Pick a color')),
body: ListView(
children: [
for (String color in ['Red', 'Green', 'Blue'])
ListTile(
title: Text(color),
onTap: () {
Navigator.pop(context);
},
),
],
),
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Списки и экраны
1Прокручиваемые списки
Список с прокруткойЭлементы спискаНачало и конецНажатие на элемент спискаРазделители между строками5Больше одного экрана
Откройте новый экранСтрелка «Назад»Вернитесь с помощью кнопкиПередайте данные на экранПолучите результат обратно6Вкладки, боковые панели и свайпы
Вкладки с панелью навигацииЗаливные значки для открытой вкладкиБоковая панельУдаление свайпомОтмена свайпаПотренируйтесь самостоятельно: Онлайн-компилятор Flutter