Menu
CoddyTech

Envie dados para uma tela

Parte da seção Listas e telas do Journey de Flutter da Coddy. Lição 21 de 33.

Uma tela de detalhes mostra um item, aquele em que você tocou. A tela é um widget, então recebe seus dados da mesma forma que qualquer widget: por meio do construtor.

class PlanetScreen extends StatelessWidget {
  const PlanetScreen({super.key, required this.planet});

  final Planet planet;
  ...
}

A tela mantém o planeta em um campo final e o lê em build: Text(planet.name). super.key é a chave que todo widget pode receber; mantenha-a primeiro.

Onde você navega para a tela, passe o planeta da linha em que tocou:

onTap: () {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => PlanetScreen(planet: planet)),
  );
},

Agora, uma única classe de tela pode exibir qualquer planeta. A lista decide qual deles.

challenge icon

Desafio

Médio

Toque em qualquer planeta: a tela sempre mostra Mercury. Faça com que PlanetScreen mostre o planeta que foi tocado:

  • adicione a ela um campo final Planet planet; e um parâmetro required this.planet
  • mostre planet.name na barra do app e Mars has 2 moons no meio (com o nome do planeta e o número de luas)
  • passe o planet tocado ao navegar para essa tela

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 StatelessWidget {
  const HomeScreen({super.key});

  final List<Planet> planets = const [
    Planet(name: 'Mercury', moons: 0),
    Planet(name: 'Venus', moons: 0),
    Planet(name: 'Earth', moons: 1),
    Planet(name: 'Mars', moons: 2),
    Planet(name: 'Jupiter', moons: 95),
    Planet(name: 'Saturn', moons: 146),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Planets')),
      body: ListView(
        children: [
          for (Planet planet in planets)
            ListTile(
              title: Text(planet.name),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const PlanetScreen()),
                );
              },
            ),
        ],
      ),
    );
  }
}

class PlanetScreen extends StatelessWidget {
  const PlanetScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Mercury')),
      body: const Center(
        child: Text('Mercury has 0 moons'),
      ),
    );
  }
}

class Planet {
  final String name;
  final int moons;

  const Planet({required this.name, required this.moons});
}
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