Livro de Receitas: Aba de Favoritos
Parte da seção Listas e telas do Journey de Flutter da Coddy. Lição 32 de 33.
Corações só são úteis se você puder encontrar seus favoritos novamente. Uma segunda aba, Favorites, mostra apenas as receitas com um coração vermelho.
As duas abas mostram uma lista de receitas com a mesma aparência, então escreva a lista uma única vez, como um método que recebe as receitas a serem exibidas:
Widget recipeList(List<Recipe> shown) {
return ListView.builder(...);
}As favoritas são as receitas where favorite é true. Calcule-as no início de build, para que a aba seja atualizada após cada setState. O corpo então mostra recipeList(recipes) ou recipeList(favorites), dependendo da aba.
Desafio
DifícilAdicione abas ao livro de receitas:
- mova o
ListView.builderpara um métodoWidget recipeList(List<Recipe> shown)que listashown - adicione uma
NavigationBarcom duas abas:Recipes(Icons.menu_book_outlined,Icons.menu_bookquando selecionada) eFavorites(Icons.star_border,Icons.starquando selecionada), mantendo oindexda aba no estado - a aba Recipes lista todas as receitas, e a aba Favorites lista apenas as favoritas
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> {
final List<Recipe> recipes = [
Recipe(name: 'Pancakes', minutes: 20, ingredients: ['Flour', 'Eggs', 'Milk', 'Butter']),
Recipe(name: 'Tomato Soup', minutes: 35, ingredients: ['Tomatoes', 'Onion', 'Garlic', 'Olive oil']),
Recipe(name: 'Guacamole', minutes: 10, ingredients: ['Avocados', 'Lime', 'Onion', 'Salt']),
Recipe(name: 'Fried Rice', minutes: 25, ingredients: ['Rice', 'Eggs', 'Peas', 'Soy sauce']),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Recipe Book')),
body: ListView.builder(
itemCount: recipes.length,
itemBuilder: (context, index) {
final Recipe recipe = recipes[index];
return ListTile(
leading: const Icon(Icons.restaurant_menu),
title: Text(recipe.name),
subtitle: Text('${recipe.minutes} min'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => RecipeScreen(recipe: recipe)),
);
},
trailing: IconButton(
icon: Icon(
recipe.favorite ? Icons.favorite : Icons.favorite_border,
color: recipe.favorite ? Colors.red : null,
),
onPressed: () {
setState(() {
recipe.favorite = !recipe.favorite;
});
},
),
);
},
),
);
}
}
class RecipeScreen extends StatelessWidget {
const RecipeScreen({super.key, required this.recipe});
final Recipe recipe;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(recipe.name)),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
Text('Ready in ${recipe.minutes} minutes', style: const TextStyle(fontSize: 18)),
const SizedBox(height: 24),
const Text('Ingredients', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
for (String ingredient in recipe.ingredients)
ListTile(
leading: const Icon(Icons.check_circle_outline),
title: Text(ingredient),
),
],
),
);
}
}
class Recipe {
final String name;
final int minutes;
final List<String> ingredients;
bool favorite = false;
Recipe({required this.name, required this.minutes, required this.ingredients});
}
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
1Listas roláveis
Uma lista que rolaItens da listaInício e fimToque em um item da listaDivisórias entre linhas4Suas Próprias Classes
Uma Classe para Seus DadosParâmetros Nomeados e ObrigatóriosCampos que Podem Ficar VaziosWidgets a Partir de Dados com mapFiltre uma Lista com whereBusque em um Map7Projeto: Livro de Receitas
Livro de Receitas: A Lista de ReceitasLivro de Receitas: A Tela da ReceitaPratique por conta própria: Compilador de Flutter online