Mobile App Development · Dart/Flutter
Organize o código em camadas — entidade, repositório e serviço — para separar responsabilidades, facilitar manutenção e preparar o terreno para um app Flutter de verdade.
Até aqui, a maioria dos exercícios resolveu tudo dentro de main(). Isso funciona para scripts pequenos, mas quando o programa cresce — como um app Flutter de verdade — misturar dado, acesso a dado e regra de negócio no mesmo lugar dificulta manutenção, testes e reuso. Nesta aula você vai aprender a separar essas responsabilidades em três camadas simples: entidade, repositório e serviço.
Representa o dado puro, sem lógica de acesso ou regra de negócio. Muda só quando o formato do dado muda.
Responsável por fornecer os dados (lista em memória, banco de dados, API...). Quem usa o repositório não precisa saber de onde o dado vem.
Contém a regra de negócio, usando o repositório para buscar dados. Muda só quando a regra de negócio muda.
O serviço recebe o repositório pelo construtor em vez de criar um internamente — facilita trocar ou testar com um repositório de mentira (fake).
fold()
Método de coleção que acumula um valor percorrendo cada elemento — usado aqui para somar preços.
main() -> Service -> Repository -> Entidade. A dependência sempre aponta para dentro, nunca o contrário.
// Entidade: representa o dado puro, sem lógica de acesso ou regra de negócio.
class Produto {
final String nome;
final double preco;
Produto(this.nome, this.preco);
}
// Repositório: responsável por fornecer os dados (de uma lista em memória,
// um banco de dados, uma API, etc). Quem usa o repositório não precisa
// saber de onde o dado vem.
class ProdutoRepository {
final List<Produto> _dados = [
Produto('Caderno', 12.5),
Produto('Caneta', 3.0),
];
List<Produto> listar() => _dados;
}
// Serviço: contém a regra de negócio, usando o repositório para buscar dados.
class ProdutoService {
final ProdutoRepository repository;
ProdutoService(this.repository);
double valorTotalEmEstoque() {
return repository.listar().fold(0, (soma, produto) => soma + produto.preco);
}
}
void main() {
// Injeção de dependência: o Service recebe o Repository pronto pelo construtor.
final repository = ProdutoRepository();
final service = ProdutoService(repository);
print('Valor total em estoque: ${service.valorTotalEmEstoque()}');
}
Valor total em estoque: 15.5