Plataforma gamificada de aprendizado de programação, construída com Flutter, Firebase e Riverpod.
- Visão geral da stack
- Pré-requisitos
- Primeiro setup (Windows)
- Primeiro setup (terminal / make)
- Rodando o app no dia a dia
- Comandos disponíveis (Makefile)
- Serviços disponíveis em desenvolvimento
- Usuários de teste
- Arquitetura e padrões de código
- Contribuindo (branch, commit e PR)
- Solução de problemas
| Tecnologia | Papel |
|---|---|
| Flutter + Dart | App mobile (Android) |
| Firebase Auth | Autenticação de usuários |
| Cloud Firestore | Banco de dados NoSQL |
| Firebase Functions | Lógica server-side em Node.js |
| Firebase Emulator Suite | Ambiente local completo via Docker |
| Riverpod 2.x | Injeção de dependência e gerenciamento de estado |
| Docker Compose | Orquestração dos emuladores Firebase |
| Node.js 18+ | Runtime das Functions e scripts de seed |
Instale as ferramentas abaixo antes de qualquer coisa:
| Ferramenta | Versão mínima | Download |
|---|---|---|
| Flutter SDK (canal stable) | 3.x | https://docs.flutter.dev/get-started/install/windows |
| Android Studio | Flamingo ou superior | https://developer.android.com/studio |
| Docker Desktop | 24+ | https://www.docker.com/products/docker-desktop |
| Node.js | 18 LTS | https://nodejs.org |
| Git | 2.x | https://git-scm.com |
Dica: Para rodar
makeno Windows, use Git Bash, MSYS2 ou WSL. Se preferir não usarmake, use os scripts.batdescritos na seção seguinte.
Validação rápida após instalar:
flutter --version
docker --version
docker compose version
node --versionO Android Studio não instala essa ferramenta por padrão, e ela é necessária para criar o emulador.
- Abra o Android Studio
- Na tela inicial, clique em More Actions → SDK Manager (ou, se já tiver um projeto aberto, vá em Tools → SDK Manager)
- Clique na aba SDK Tools
- Marque Android SDK Command-line Tools (latest)
- Clique Apply e aguarde o download concluir
Esse passo só precisa ser feito uma vez por máquina.
Se você está no Windows e quer um setup com clique duplo, use os scripts .bat:
git clone <URL_DO_REPOSITORIO>
cd codequest
setup-dev.bat
O que esse script faz, em ordem:
- Verifica se Flutter, Docker (em execução) e Node.js estão instalados
- Verifica se o Android SDK e o
cmdline-toolsestão presentes - Configura
ANDROID_HOMEeANDROID_SDK_ROOTpermanentemente nas variáveis de ambiente do usuário - Instala a system image
android-35;google_apis;x86_64(se ausente) - Aceita todas as licenças do Android SDK
- Cria o emulador
Pixel8_API35(se ausente) - Instala dependências Flutter (
flutter pub get) e Node.js das functions e seed - Cria o arquivo
.enva partir de.env.example(se não existir) - Sobe o Firebase Emulator Suite via
docker compose up -d --build
O script é idempotente: pode ser executado várias vezes sem problemas.
git clone <URL_DO_REPOSITORIO>cd codequestmake env-initCria o arquivo .env a partir de .env.example.
make infra-upO que esse comando faz automaticamente:
- Configura
ANDROID_HOMEeANDROID_SDK_ROOTpermanentemente - Instala a system image
android-35;google_apis;x86_64(se ausente) - Aceita todas as licenças do SDK
- Cria o emulador
Pixel8_API35(se ausente) - Sobe o Docker + Firebase Emulators
flutter pub getrun-dev.bat
make run-devO que acontece ao executar:
- Verifica se o emulador
Pixel8_API35já está rodando - Se não estiver, inicia o emulador com renderização segura (
swiftshader_indirect) e aguarda o boot completo - Roda
flutter run --dart-define=USE_EMULATOR=true --no-enable-impeller
O flag USE_EMULATOR=true faz o app apontar para os emuladores locais do Firebase em vez da produção.
Primeira subida completa:
make upRodar apenas o app depois que a infra já está ativa:
make run-devParar somente o app Flutter:
q
ou Ctrl + C no terminal onde o Flutter está rodando.
Parar Firebase/Docker:
make downReiniciar tudo do zero:
make down
adb emu kill
make up| Comando | O que faz |
|---|---|
make infra-up | Setup completo: Android SDK + Docker + Firebase Emulators |
make infra-down | Para e remove os containers Docker |
make down | Alias de make infra-down |
make run-dev | Inicia emulador (se necessário) + flutter run |
make up | infra-up + bootstrap + run-dev |
make bootstrap | Instala dependências e roda geração de código |
make analyze | flutter analyze |
make test | flutter test |
make ci | bootstrap + analyze + test (usado em pipeline) |
make seed | Popula o Firestore com dados de teste |
make android-setup | Configura Android SDK isoladamente (sem Docker) |
make env-init | Cria .env a partir de .env.example |
| Serviço | URL / Endereço |
|---|---|
| Firebase Emulator UI | http://localhost:4000 |
| Authentication | localhost:9099 |
| Firestore | localhost:8080 |
| Cloud Functions | localhost:5001 |
Logs do app Android/Flutter:
adb logcat |Select-String"flutter|FirebaseAuth|RecaptchaCallWrapper|Cleartext|E/flutter|FATAL|Exception"Últimas linhas do app Android/Flutter:
adb logcat -d -t 400|Select-String"flutter|FirebaseAuth|RecaptchaCallWrapper|Cleartext|E/flutter|FATAL|Exception"Logs dos emuladores Firebase:
make logsStatus dos containers:
docker compose psOs usuários abaixo são criados automaticamente pelo seed ao subir o emulador:
| Senha | |
|---|---|
| dev@codequest.com | Dev@123456 |
| alice@codequest.com | Dev@123456 |
| bob@codequest.com | Dev@123456 |
| admin@codequest.com | Dev@123456 |
Para repopular os dados de teste:
make seedO projeto segue Clean Architecture por feature, DDD tático e SOLID em todas as camadas.
lib/features/<feature>/
domain/ → entidades, contratos, value objects (sem dependências externas)
application/ → casos de uso e regras de negócio
data/ → implementações concretas (Firebase, HTTP, local)
providers/ → injeção de dependência via Riverpod
presentation/ → telas e widgets (somente renderização)
- A camada
domainnunca importa Firebase, Flutter ou qualquer detalhe de infraestrutura - Widgets não contêm regra de negócio
- Repositórios apenas acessam a fonte de dados
- Use cases orquestram as operações de domínio
| Documento | Descrição |
|---|---|
AGENTS.md | Regras para agentes de IA e devs |
docs/ARCHITECTURE.md | Arquitetura detalhada |
docs/ENGINEERING_GUIDELINES.md | Boas práticas de engenharia |
docs/BUSINESS_CORE_AUTH.md | Regras de negócio do módulo de autenticação |
docs/RELEASE_AND_FIREBASE.md | Firebase real, release e publicação Android |
git checkout main
git pull origin mainUse o padrão:
feat/<nome-curto> → nova funcionalidade
fix/<nome-curto> → correção de bug
chore/<nome-curto> → tarefas de manutenção, configs
docs/<nome-curto> → atualização de documentação
Exemplo:
git checkout -b feat/auth-login-flowflutter analyze
flutter testUse Conventional Commits:
git commit -m "feat(auth): add sign in with email and password"
git commit -m "fix(profile): handle missing leagueId on first login"
git commit -m "chore: update android setup script"Inclua no corpo do PR:
- Objetivo: o que foi feito e por quê
- Camadas alteradas: ex.
domain,data,providers - Como testar: passo a passo para validar a mudança
- Screenshot ou GIF se houver alteração visual
Checklist mínimo antes de abrir o PR:
- App roda localmente sem erros
flutter analyzesem warnings novosflutter testpassando- Documentação atualizada (se aplicável)
Sintoma:Cannot connect to the Docker daemon
Solução:
- Abra o Docker Desktop
- Aguarde o ícone na bandeja do sistema ficar verde (status: running)
- Execute
make infra-upnovamente
Sintoma: erros de rede ou timeout ao tentar login/leitura
Solução:
- Confirme que os emuladores estão ativos: http://localhost:4000
- Verifique se o app está rodando com
--dart-define=USE_EMULATOR=true - No Android Emulator,
localhostdentro do emulador aponta para10.0.2.2— verifique sefirebase_config.dartusa o endereço correto
Sintoma: ao tentar entrar com usuário seed, aparece Erro inesperado de autenticacao.
Como diagnosticar:
adb logcat -d -t 400|Select-String"FirebaseAuth|RecaptchaCallWrapper|Cleartext|E/flutter|Exception"Se aparecer Cleartext HTTP traffic to 10.0.2.2 not permitted, o app instalado está desatualizado ou foi buildado sem a permissão local de HTTP.
Solução:
adb emu kill
make run-devO projeto permite cleartext local no Android para conversar com Firebase Emulators via 10.0.2.2.
Sintoma:No supported devices connected
Solução:
- Verifique se o AVD existe:
make android-setup(idempotente) - Inicie o emulador:
make run-dev - Confirme a listagem:
flutter devices
Sintoma: o app parece estar aberto, mas a tela mostra apenas o fundo do Android Emulator ou uma tela sem widgets.
Causa provável: bug de renderização GPU do Android Emulator com o backend gráfico padrão.
Solução:
adb emu kill
make run-devO script make run-dev inicia o AVD Pixel8_API35 com -gpu swiftshader_indirect -no-snapshot-load e roda o app com --no-enable-impeller, que é o modo estável validado para este projeto no Windows.
Sintoma: aparece um loading circular e a tela de login não carrega.
Solução:
- Confirme que os emuladores Firebase estão ativos em http://localhost:4000
- Rode
make seedse os usuários de teste não existirem no Auth Emulator - Reinicie o app com
make run-dev
Solução:
make down
make infra-up
make seedSolução:
- Use Git Bash (inclui
makevia MSYS2) - Ou use os scripts
.batdiretamente:setup-dev.baterun-dev.bat