Odbierz wynik
Część sekcji Listy i ekrany ścieżki Flutter w Coddy. Lekcja 22 z 33.
Niektóre ekrany służą do zadawania pytań: wybierz kolor, wybierz datę. Odpowiedź musi wrócić do ekranu, który zadał pytanie. Navigator.pop może ją przekazać:
Navigator.pop(context, 'Green');Po drugiej stronie Navigator.push zwraca Future: wartość, która pojawia się później, gdy ekran dodany na stos zostanie zamknięty. await czeka na tę wartość, a funkcja, która czeka, jest oznaczona jako async:
onPressed: () async {
final String? color = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ColorScreen()),
);
if (color != null) {
setState(() {
chosen = color;
});
}
},Wynikiem jest String?: gdy ktoś wyjdzie za pomocą strzałki wstecz, nic nie zostanie wysłane, a color będzie mieć wartość null. W takim przypadku if zachowuje poprzedni wybór. W dalszej sekcji poznasz całą historię Future i await.
Wyzwanie
ŚredniWybranie koloru zamyka ekran wyboru koloru, ale ekran główny nigdy się o tym nie dowiaduje. Spraw, aby wybrany kolor wracał:
- na ekranie wyboru koloru zamknij go, przekazując kolor:
Navigator.pop(context, color) - na ekranie głównym użyj
awaitprzy wywołaniu push i, gdy wróci kolor, wyświetlYour color: Green(z wybranym kolorem) - wyjście za pomocą strzałki wstecz pozostawia poprzedni tekst
Spróbuj swoich sił
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);
},
),
],
),
);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Listy i ekrany
1Przewijane listy
Lista z przewijaniemElementy listyPoczątek i koniecDotknij elementu listySeparatory między wierszami5Więcej niż jeden ekran
Otwórz nowy ekranStrzałka wsteczWróć za pomocą przyciskuPrześlij dane do ekranuOdbierz wynik6Karty, szuflady i gesty przesunięcia
Karty z paskiem nawigacyjnymWypełnione ikony dla otwartej kartyBoczna szufladaPrzesuń, aby usunąćCofnij przesunięciePoćwicz samodzielnie: Kompilator Flutter online