Menu
CoddyTech

Ricevi un risultato

Fa parte della sezione Elenchi e schermate del percorso Flutter di Coddy. Lezione 22 di 33.

Alcune schermate servono per porre una domanda: scegli un colore, scegli una data. La risposta deve tornare alla schermata che ha posto la domanda. Navigator.pop può trasportarla:

Navigator.pop(context, 'Green');

Dall'altra parte, Navigator.push restituisce un Future: un valore che arriva più tardi, quando la schermata aperta viene chiusa. await lo attende e la funzione che attende è contrassegnata con async:

onPressed: () async {
  final String? color = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => const ColorScreen()),
  );
  if (color != null) {
    setState(() {
      chosen = color;
    });
  }
},

Il risultato è una String?: quando qualcuno esce con la freccia indietro, non viene inviato nulla e color è null. In quel caso, if mantiene la scelta precedente. Una sezione successiva spiega per intero Future e await.

challenge icon

Sfida

Medio

La scelta di un colore chiude la schermata dei colori, ma la schermata iniziale non ne viene mai informata. Fai in modo che la scelta venga restituita:

  • nella schermata dei colori, chiudi la schermata restituendo il colore: Navigator.pop(context, color)
  • nella schermata iniziale, usa await con la chiamata push e, quando viene restituito un colore, mostra Your color: Green (con il colore scelto)
  • uscendo con la freccia indietro, il testo precedente rimane invariato

Provalo tu

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);
              },
            ),
        ],
      ),
    );
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Elenchi e schermate

Esercitati da solo: Compilatore Flutter online