Mobile App Development · Dart/Flutter
Dois cenários mais completos combinando classes, listas de objetos e laços: um catálogo de produtos e um sistema de gerenciamento de tarefas.
Desafio 1
Modela um catálogo com a classe Produto, uma List<Produto> e um acumulador que soma o preço de cada item enquanto percorre a lista com for-in.
// Desafio: criar um catálogo de produtos com classe, lista e acumulador.
// Demonstra como combinar orientação a objetos com controle de fluxo.
// Classe Produto com três atributos e um método de exibição.
class Produto {
String nome;
String categoria;
double preco;
// Construtor posicional: recebe nome, categoria e preço nessa ordem.
Produto(this.nome, this.categoria, this.preco);
// Exibe um resumo do produto com todos os atributos separados por " | ".
void exibirResumo() {
print('$nome | $categoria | R\$ ${preco.toStringAsFixed(2)}');
}
}
void main() {
// Lista de produtos do catálogo — cada elemento é um objeto Produto.
List<Produto> produtos = [
Produto('Mouse', 'Acessorios', 89.90),
Produto('Teclado', 'Acessorios', 150.00),
Produto('Monitor', 'Video', 900.00),
];
// Acumulador para somar os preços de todos os produtos.
double total = 0;
print('=== Catalogo ===');
// Percorre cada produto, exibe seu resumo e acumula o preço no total.
for (Produto produto in produtos) {
produto.exibirResumo();
total += produto.preco;
}
// Exibe o valor total de todos os produtos cadastrados no catálogo.
print('Total cadastrado: R\$ ${total.toStringAsFixed(2)}');
}
Saída esperada
=== Catalogo === Mouse | Acessorios | R$ 89.90 Teclado | Acessorios | R$ 150.00 Monitor | Video | R$ 900.00 Total cadastrado: R$ 1139.90
Como executar
dart run 06-Objetos/03_Desafio/codigo_fonte/desafio_01_catalogo_produtos.dart
Desafio 2
Modela tarefas com a classe Tarefa, usando um parâmetro nomeado opcional ({this.concluida = false}) e um método concluir() que altera o estado do objeto.
// Desafio: sistema de gerenciamento de tarefas com classe e lista de objetos.
// Demonstra uso de atributo bool, parâmetro nomeado opcional e método de ação.
class Tarefa {
String titulo;
String prioridade;
// 'concluida' começa como false por padrão (tarefa ainda não realizada).
bool concluida;
// O parâmetro 'concluida' é nomeado e opcional — padrão é false.
Tarefa(this.titulo, this.prioridade, {this.concluida = false});
// Método de ação: marca a tarefa como concluída alterando o atributo 'concluida'.
void concluir() {
concluida = true;
}
// Exibe um resumo da tarefa com título, prioridade e status atual.
void exibirResumo() {
// Operador ternário converte bool para texto legível.
String status = concluida ? 'concluida' : 'pendente';
print('$titulo | Prioridade: $prioridade | Status: $status');
}
}
void main() {
// Cria uma lista com três tarefas — todas começam como pendentes.
List<Tarefa> tarefas = [
Tarefa('Estudar funcoes', 'alta'),
Tarefa('Praticar classes', 'alta'),
Tarefa('Revisar colecoes', 'media'),
];
// Marca a primeira tarefa como concluída usando o índice [0].
tarefas[0].concluir();
print('=== Tarefas ===');
// Percorre a lista e exibe o resumo atualizado de cada tarefa.
for (Tarefa tarefa in tarefas) {
tarefa.exibirResumo();
}
}
Saída esperada
=== Tarefas === Estudar funcoes | Prioridade: alta | Status: concluida Praticar classes | Prioridade: alta | Status: pendente Revisar colecoes | Prioridade: media | Status: pendente
Como executar
dart run 06-Objetos/03_Desafio/codigo_fonte/desafio_02_sistema_tarefas.dart