Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Escolher 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 await ao fazer o push e, quando uma cor retornar, mostre Your 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);
              },
            ),
        ],
      ),
    );
  }
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Flutter online