Recibir un resultado
Parte de la sección Listas y pantallas del Journey de Flutter de Coddy. Lección 22 de 33.
Algunas pantallas existen para hacer una pregunta: elegir un color, elegir una fecha. La respuesta debe volver a la pantalla que hizo la pregunta. Navigator.pop puede llevarla:
Navigator.pop(context, 'Green');En el otro lado, Navigator.push devuelve un Future: un valor que llega más tarde, cuando se cierra la pantalla insertada. await espera a que llegue, y la función que espera se marca como async:
onPressed: () async {
final String? color = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ColorScreen()),
);
if (color != null) {
setState(() {
chosen = color;
});
}
},El resultado es un String?: cuando alguien sale con la flecha hacia atrás, no se envía nada y color es null. Entonces, el if conserva la opción anterior. Una sección posterior explica toda la historia de Future y await.
Desafío
IntermedioAl elegir un color, se cierra la pantalla de colores, pero la pantalla de inicio nunca se entera. Haz que la elección vuelva:
- en la pantalla de colores, cierra la pantalla pasando el color:
Navigator.pop(context, color) - en la pantalla de inicio, espera con
awaita que se complete la navegación y, cuando vuelva un color, muestraYour color: Green(con el color elegido) - al salir con la flecha de retroceso, se conserva el texto anterior
Pruébalo tú mismo
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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Listas y pantallas
1Listas con desplazamiento
Una lista desplazableElementos de listaAl principio y al finalToca un elemento de listaSeparadores entre filas5Más de una pantalla
Abrir una nueva pantallaLa flecha de retrocesoVolver con un botónEnviar datos a una pantallaRecibir un resultado3Tarjetas y cuadrículas
Tarjetas en una listaUna cuadrícula de mosaicosUna cuadrícula creada con un constructor6Pestañas, cajones y deslizamientos
Pestañas con una barra de navegaciónIconos rellenos para la pestaña abiertaUn cajón lateralDeslizar para eliminarDeshacer un deslizamientoPractica por tu cuenta: Compilador de Flutter online