Receba um resultado de volta
Parte da seção Listas e telas do Journey de Flutter da Coddy. Lição 22 de 33.
Algumas telas existem para fazer uma pergunta: escolha uma cor, escolha uma data. A resposta precisa voltar para a tela que fez a pergunta. Navigator.pop pode carregá-la:
Navigator.pop(context, 'Green');Do outro lado, Navigator.push retorna um Future: um valor que chega mais tarde, quando a tela aberta é fechada. await espera por ele, e a função que espera é marcada com async:
onPressed: () async {
final String? color = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ColorScreen()),
);
if (color != null) {
setState(() {
chosen = color;
});
}
},O resultado é um String?: quando alguém sai usando a seta de voltar, nada é enviado e color é null. Nesse caso, o if mantém a escolha anterior. Uma seção posterior explica toda a história de Future e await.
Desafio
MédioEscolher uma cor fecha a tela de cores, mas a tela inicial nunca fica sabendo. Faça a escolha retornar:
- na tela de cores, use pop com a cor:
Navigator.pop(context, color) - na tela inicial, use
awaitao fazer o push e, quando uma cor retornar, mostreYour color: Green(com a cor escolhida) - sair usando a seta para voltar mantém o texto antigo
Experimente você mesmo
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);
},
),
],
),
);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Listas e telas
1Listas roláveis
Uma lista que rolaItens da listaInício e fimToque em um item da listaDivisórias entre linhas5Mais de uma tela
Abra uma nova telaA seta VoltarVolte com um botãoEnvie dados para uma telaReceba um resultado de voltaPratique por conta própria: Compilador de Flutter online