Récupérer un résultat
Fait partie de la section Listes et écrans du Journey Flutter de Coddy. Leçon 22 sur 33.
Certains écrans servent à poser une question : choisir une couleur, choisir une date. La réponse doit revenir à l’écran qui l’a posée. Navigator.pop peut la transmettre :
Navigator.pop(context, 'Green');De l’autre côté, Navigator.push renvoie un Future : une valeur qui arrive plus tard, lorsque l’écran ajouté est retiré. await l’attend, et la fonction qui attend est marquée async :
onPressed: () async {
final String? color = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ColorScreen()),
);
if (color != null) {
setState(() {
chosen = color;
});
}
},Le résultat est un String? : lorsque quelqu’un quitte l’écran avec la flèche de retour, rien n’est envoyé et color vaut null. Le if conserve alors l’ancien choix. Une section ultérieure raconte toute l’histoire de Future et de await.
Défi
MoyenChoisir une couleur ferme l’écran des couleurs, mais l’écran d’accueil n’en est jamais informé. Faites revenir le choix :
- sur l’écran des couleurs, faites un pop avec la couleur :
Navigator.pop(context, color) - sur l’écran d’accueil, faites un
awaitdu push et, lorsqu’une couleur est renvoyée, affichezYour color: Green(avec la couleur choisie) - quitter avec la flèche de retour conserve l’ancien texte
Essayez vous-même
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);
},
),
],
),
);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Listes et écrans
1Listes défilantes
Une liste qui défileÉléments de listeDébut et finAppuyer sur un élément de listeSéparateurs entre les lignes2Des listes à partir de données
Construire des lignes avec un générateurNuméroter les lignesLignes avec séparateurs5Plus d’un écran
Ouvrir un nouvel écranLa flèche de retourRevenir avec un boutonEnvoyer des données à un écranRécupérer un résultatEntraînez-vous par vous-même : Compilateur Flutter en ligne