# bolão — mobile

App de bolão. **Flutter 3.44 + Dart 3.12**, iOS e Android.

Nenhuma feature implementada ainda: este repositório contém apenas o
scaffold e as dependências da stack. `lib/main.dart` ainda é o contador
gerado pelo `flutter create`.

## Stack

| Camada     | Escolha                              |
| ---------- | ------------------------------------ |
| Estado     | `flutter_riverpod` (sem code-gen)    |
| Navegação  | `go_router`                          |
| HTTP       | `dio`                                |
| Modelos    | `freezed` + `json_serializable`      |
| Plataformas| Android e iOS (web/desktop desligados) |

Bundle id / applicationId: `br.com.rarolabs.bolao_mobile`.

## Rodando localmente

```bash
flutter pub get
flutter run
```

Para regenerar modelos depois de mexer em classes `@freezed` / `@JsonSerializable`:

```bash
dart run build_runner build --delete-conflicting-outputs
```

## Comandos

| Comando                | O que faz                        |
| ---------------------- | -------------------------------- |
| `flutter run`          | Roda em emulador/device          |
| `flutter analyze`      | Análise estática (deve ficar limpa) |
| `flutter test`         | Testes de unidade e widget       |
| `dart format .`        | Formata o código                 |
| `dart run build_runner watch` | Codegen em watch mode     |

## Pendências de ambiente

`flutter analyze` e `flutter test` rodam, mas **o app ainda não pode ser
executado em device** nesta máquina — `flutter doctor` aponta:

- **Android SDK não instalado** — instale o Android Studio e rode o setup
  inicial (ou `flutter config --android-sdk <caminho>` se já tiver em
  local customizado).
- **Xcode incompleto e CocoaPods ausente** — instale o Xcode completo,
  depois:
  ```bash
  sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
  sudo xcodebuild -runFirstLaunch
  brew install cocoapods
  ```

## Notas de setup (não óbvias)

- **Riverpod está sem code generation, de propósito.** `riverpod_generator`
  4.0.8 exige `analyzer ^13` e o `freezed` estável exige `analyzer >=9 <11`
  — não há versão em que os dois coexistam. Como Riverpod funciona bem sem
  codegen (`Notifier`/`Provider` escritos à mão) e `freezed` não tem
  substituto real para modelos imutáveis + JSON, a escolha foi manter
  `freezed` e escrever os providers manualmente. Não use a anotação
  `@riverpod`: ela depende do gerador.
- **`freezed` está pinado numa prerelease** (`^3.2.6-dev.1`). O `freezed`
  estável (3.2.5) não aceita o `analyzer` 12 que o `flutter_test` deste
  Flutter traz. É `dev_dependency` (ferramenta de build, não vai no
  binário do app), então o risco fica no build. Revise ao atualizar o
  Flutter — provavelmente já haverá estável compatível.

## Identidade visual

Cor da marca **#615FF6** (Raro Labs), aplicada via `lib/core/tema/tema.dart`. A
escolha de `DynamicSchemeVariant.fidelity` em vez do padrão do Flutter é
deliberada e está explicada — junto com os contrastes medidos e os dois defeitos
de acessibilidade corrigidos no caminho — em `docs/identidade-visual.md`.

Cores semânticas (sucesso, campeão) ficam em `CoresDoApp` e **não** seguem a
marca: verde quer dizer "deu certo" em qualquer app, e violeta no lugar do verde
apagaria o sinal.
