Este projeto é a solução para o Desafio Técnico - Desenvolvedor(a) Flutter proposto pela Bus2. O objetivo é criar um aplicativo que consome a API pública randomuser.me para exibir, salvar e gerenciar perfis de usuários aleatórios.
- O Desafio
- Funcionalidades Implementadas
- Arquitetura e Decisões Técnicas
- Como Executar
- Estrutura de Pastas
O objetivo principal é construir um aplicativo Flutter que exiba informações de pessoas consumidas da API https://randomuser.me/api/.
O desafio especificou um conjunto de regras técnicas que nortearam o desenvolvimento:
- Padrão de Arquitetura: Uso obrigatório do padrão MVVM (Model-View-ViewModel).
- Padrão de Dados: Implementação obrigatória da Repository Strategy.
- Programação: Uso obrigatório de Orientação a Objetos (OO).
- Parsing de Dados: O JSON da API deve ser parseado para modelos Dart e, posteriormente, convertido para um modelo de persistência.
- Persistência: O aplicativo deve persistir dados localmente (tecnologia de livre escolha).
- Atualização de Dados: Utilização de Ticker(explicitamente nãoTimer) para realizar novas requisições à API.
- Gerenciamento de Estado: Livre escolha do desenvolvedor (ex: GetX, Cubit, Bloc, Provider).
O aplicativo foi estruturado em três telas principais, conforme solicitado.
- Busca Contínua: Ao iniciar a tela, um Tickeré ativado e, a cada 5 segundos, uma nova requisição busca um usuário na API.
- Listagem de Sessão: Os usuários buscados pelo Tickersão adicionados a uma lista de sessão exibida na tela.
- Navegação:
- Cada item da lista é clicável, levando à Tela de Detalhes do usuário.
- Um botão com ícone de "Database" no AppBarredireciona para a Tela de Usuários Persistidos.
 
- Exibição Completa: Exibe todas as informações do usuário selecionado, consumindo o modelo de dados completo da API.
- Organização por Grupos: As informações são organizadas em grupos (ex: "Contato", "Localização", "Pessoal"), conforme o modelo da API.
- Ação de Persistência: Um botão permite "Salvar" ou "Remover" o usuário da persistência local (banco de dados).
- Listagem do DB: Exibe uma lista de todos os usuários que foram salvos no banco de dados local.
- Ações na Lista:
- Permite acessar os detalhes de cada usuário salvo.
- Permite remover o usuário da persistência diretamente pela lista.
 
- Atualização de Estado: Ao retornar da tela de detalhes ou após uma remoção, a lista é atualizada automaticamente.
Para atender aos requisitos obrigatórios e criar um app robusto, as seguintes decisões foram tomadas:
- 
Arquitetura: MVVM + Repository - Model: Modelos Dart puros que representam a resposta da API (ex: User,Location,Name) e os modelos de persistência.
- View: Widgets (Telas) responsáveis apenas por exibir a UI e reagir a mudanças de estado.
- ViewModel: (Usando Provider com ChangeNotifier) Contém a lógica de negócios, o estado da tela e a comunicação com o Repositório.
- Repository: UserRepositoryImplimplementa aRepository Strategy, abstraindo as fontes de dados (ApiDataSourceeLocalDataSource).
 
- Model: Modelos Dart puros que representam a resposta da API (ex: 
- 
Stack Tecnológica: - Gerenciamento de Estado: provider(escolhido por ser leve e se adequar bem ao MVVM comChangeNotifier).
- Requisições API: dio(para chamadas de rede robustas e tratamento de erros).
- Persistência: hive(escolhido por ser um banco de dados NoSQL rápido, leve e nativo em Dart, facilitando o armazenamento dos modelos OO).
- Design: google_fonts(para uma tipografia mais sofisticada).
 
- Gerenciamento de Estado: 
- 
TickervsTimer:- O requisito de usar Tickerfoi implementado naHomeScreenutilizando umTickerProviderStateMixin. OTickeré mais eficiente que umTimerpara animações ou atualizações de UI, pois ele se sincroniza com o pipeline de renderização do Flutter (vsync), evitando trabalho desnecessário quando a tela não está visível.
 
- O requisito de usar 
- 
Clone o repositório: git clone https://github.com/seu-usuario/bus2-flutter-challenge.git cd bus2-flutter-challenge
- 
Instale as dependências: flutter pub get 
- 
Execute o gerador de código (se usar Hive/Drift/Freezed): (Se estiver usando Hive, como sugerido) flutter pub run build_runner build 
- 
Execute o aplicativo: flutter run 
O projeto segue uma estrutura de feature-first, separando as camadas de MVVM dentro de cada funcionalidade.
lib/
├── core/
│   ├── theme/
│   │   └── app_theme.dart      # Design System (Cores, Fontes, Tema)
│   └── utils/                  # Classes utilitárias
│
├── features/
│   ├── home/
│   │   ├── view/
│   │   │   └── home_screen.dart
│   │   └── viewmodel/
│   │       └── home_viewmodel.dart
│   │
│   ├── details/
│   │   ├── view/
│   │   │   └── details_screen.dart
│   │   └── viewmodel/
│   │       └── details_viewmodel.dart
│   Note: This structure is based on the provided PDF and general best practices.
│   ├── persisted/
│   │   ├── view/
│   │   │   └── persisted_screen.dart
│   │   └── viewmodel/
│   │       └── persisted_viewmodel.dart
│   │
│   └── user/                   # Feature "Cross" (compartilhada)
│       ├── model/
│       │   └── user_model.dart # Modelos OO (User, Name, Location...)
│       └── repository/
│           ├── datasource/
│           │   ├── user_api_data_source.dart
│           │   └── user_local_data_source.dart
│           ├── user_repository.dart        # Interface (Abstração)
│           └── user_repository_impl.dart   # Implementação
│
├── main.dart                   # Ponto de entrada
└── ...