Orbit App 📱
O aplicativo oficial do Orbit, construído com Flutter, focado em entregar uma experiência social fluida, rica em animações e com recursos avançados de tempo real. Roda nativamente em iOS e Android.
🚀 Tecnologias e Arquitetura
| Tecnologia | Pacote / Versão | Uso |
|---|---|---|
| Flutter | SDK Stable, Dart ^3.13.0 | Framework principal |
| Gerenciamento de Estado | flutter_bloc ^9.1.1 + Cubit | Lógica de negócio e estado de UI |
| Navegação | go_router ^17.x | Roteamento declarativo e deep links |
| Banco Local | objectbox ^5.x | Cache offline de alta performance |
| Code Push | shorebird_code_push ^2.x | Atualizações sem revisão de store |
| Networking | dio ^5.x + web_socket_channel ^3.x | HTTP e WebSockets |
| Autenticação | firebase_auth ^6.x + google_sign_in ^7.x + sign_in_with_apple ^8.x | Login multi-provedor |
| Push Notifications | firebase_messaging ^16.x + flutter_local_notifications ^22.x | FCM + notificações locais |
| Chamadas A/V | livekit_client ^2.x | Vídeo/áudio em grupo (até 8 pessoas) |
| Jogos Web | flutter_inappwebview ^6.x + flame ^1.x | WebView (micro-frontends React) + pets |
| ML | google_mlkit_face_detection, google_mlkit_image_labeling | Detecção de rosto e objetos |
| Criptografia | cryptography ^2.x + cryptography_flutter ^2.x | Criptografia E2E das mensagens |
| Mídia | image_picker, camera, video_player, video_editor, pro_image_editor | Captura e edição de mídia |
| Analytics | firebase_analytics ^12.x | Rastreamento de uso |
| Monetização | google_mobile_ads ^9.x + in_app_purchase ^3.x | Anúncios e compras no app |
| i18n | flutter_localizations | pt, en, es |
📂 Estrutura do Projeto
app/
├── lib/
│ ├── main.dart # Entry point, inicialização e router raiz
│ ├── firebase_options.dart # Config gerada do Firebase
│ │
│ ├── core/ # Infraestrutura central
│ │ ├── config/ # AppInitializer, AppConfigService
│ │ ├── database/ # ObjectBoxService
│ │ ├── di/ # AppProviders (injeção de deps)
│ │ ├── routes/ # AppRoutes (GoRouter)
│ │ └── update/ # UpdateCubit
│ │
│ ├── blocs/ # BLoCs de lógica pesada
│ │ └── auth/ # AuthBloc
│ │
│ ├── provider/ # Cubits de estado de UI
│ ├── models/ # Data classes (39 modelos)
│ ├── services/ # Regras de negócio e APIs (51 serviços)
│ ├── screens/ # Telas do app (204 telas)
│ ├── widgets/ # Componentes reutilizáveis (134 widgets)
│ ├── theme/ # Temas visuais + temas sazonais
│ ├── l10n/ # Strings de i18n (.arb)
│ └── utils/ # Helpers e utilitários
│
├── assets/
│ ├── img/ # Imagens e ícones
│ ├── img/badges/ # Badges de perfil
│ ├── img/default/ # Ícones SVG da navegação
│ ├── sounds/ # Sons do app
│ ├── app_icon/ # Ícone do app
│ └── age_verification/ # Assets de verificação de idade
│
├── android/ # Configuração Android
├── ios/ # Configuração iOS
├── pubspec.yaml # Manifesto de dependências
├── shorebird.yaml # Configuração do Shorebird
└── l10n.yaml # Configuração de i18n🛠️ Setup de Desenvolvimento
1. Pré-requisitos
- Flutter SDK (stable) com Dart ^3.13.0
- Android Studio ou Xcode (para builds nativas)
- Shorebird CLI (opcional — apenas para Code Push)
- Arquivo
google-services.jsonnoandroid/app/eGoogleService-Info.plistnoios/Runner/
2. Instalação
flutter pub get
# Gerar código ObjectBox (obrigatório após alterar modelos anotados com @Entity)
dart run build_runner build --delete-conflicting-outputs3. Rodar
# Android ou iOS
flutter run⚡ Shorebird (Code Push)
O Orbit usa Shorebird para publicar correções críticas em segundos, sem ciclo de revisão da store.
# Criar nova release (versão completa)
shorebird release android
shorebird release ios
# Publicar patch de correção (sem mudar versão)
shorebird patch android
shorebird patch iosIMPORTANT
O Code Push do Shorebird só funciona em builds nativas (Android/iOS).
🌍 Internacionalização (i18n)
O app suporta Português (pt), Inglês (en) e Espanhol (es). As strings são definidas em arquivos .arb na pasta lib/l10n/.
Para adicionar ou editar strings:
- Edite o arquivo
.arbcorrespondente (ex:app_pt.arb) - Execute
flutter gen-l10n(ouflutter pub getcomgenerate: truenopubspec.yaml) - Use via
AppLocalizations.of(context)?.chave
🔒 Criptografia E2E
O chat usa criptografia ponta-a-ponta implementada via cryptography e cryptography_flutter. A inicialização ocorre via ChatService.initializeEncryption() logo após o AuthSuccess. As chaves são armazenadas de forma segura via flutter_secure_storage.
🎨 Sistema de Temas
O ThemeCubit controla o tema do app. Há três modos: light, dark, system. Além dos temas base, o app detecta automaticamente datas sazonais e aplica temas decorativos:
| Tema | Arquivo | Período |
|---|---|---|
| Natal | theme/christmas.dart | Dezembro |
| Halloween | theme/halloween.dart | Outubro |
| Ano Novo | theme/new_year.dart | Janeiro |
| Dia dos Namorados | theme/valentines.dart | Fevereiro |
| Copa do Mundo | theme/world_cup.dart | Conforme agenda |
| Aniversário | theme/birthday.dart | Aniversário do app |
O Modo Exile (exiledLightTheme / exiledDarkTheme) é aplicado automaticamente para usuários com restrições ativas na plataforma.
🔐 Boas Práticas
- Service Layer obrigatório: Nunca chame a API diretamente de um Widget. Fluxo:
Widget → Cubit → Service → API - Bloc para lógica, Cubit para estado: Use
BLoCapenas para fluxos com múltiplos eventos complexos. Para estados simples, prefiraCubit. - MediaQuery.sizeOf: Use
MediaQuery.sizeOf(context)(não.of) para evitar rebuilds desnecessários quando o teclado abre. - ScrollBlur: Widgets com
BackdropFilterdevem checarSettingsCubit.isScrollingFastpara desativar o blur durante o scroll.
IMPORTANT
Configure corretamente o google-services.json (Android) e GoogleService-Info.plist (iOS) antes de rodar o app. Sem eles, o Firebase — e consequentemente autenticação e notificações — não funcionarão.
📦 Todas as Dependências do App
Clique para expandir todas as bibliotecas
- flutter:
local/sdk - sdk:
flutter - flutter_localizations:
local/sdk - sdk:
flutter - age_range_signals:
^0.10.0 - app_badge_plus:
^1.3.5 - audioplayers:
^6.8.1 - bloc:
^9.2.1 - cached_network_image:
^4.0.4 - camera:
^0.12.1 - cloud_firestore:
^6.9.0 - collection:
^1.19.1 - connectivity_plus:
^7.3.1 - crypto:
^3.0.7 - cryptography:
^2.9.0 - cryptography_flutter:
^2.3.2 - cupertino_icons:
^2.0.0 - cupertino_ui:
^1.0.2 - device_info_plus:
^13.2.0 - device_integrity:
^1.0.3 - dio:
^5.11.1 - emoji_picker_flutter:
^4.5.4 - file_picker:
^13.1.0 - firebase_app_installations:
^0.4.4 - firebase_auth:
^6.7.0 - firebase_core:
^4.15.0 - firebase_messaging:
^16.7.0 - fl_chart:
^1.2.0 - flame:
^1.38.2 - flutter_bloc:
^9.1.1 - flutter_cache_manager:
^3.4.5 - flutter_foreground_task:
^11.0.3 - flutter_image_compress:
^2.5.0 - flutter_inappwebview:
^6.2.0-beta.3 - flutter_local_notifications:
^22.3.1 - flutter_markdown_plus:
^1.0.12 - flutter_secure_storage:
^11.2.0 - flutter_slidable:
^4.0.3 - flutter_svg:
^2.3.0 - font_awesome_flutter:
^11.0.0 - klipy_flutter:
^0.0.3 - go_router:
^18.0.2 - google_fonts:
^9.0.0 - google_mlkit_face_detection:
^0.15.1 - google_mobile_ads:
^9.0.0 - google_sign_in:
^7.2.0 - http_parser:
^4.1.2 - image:
^4.10.1 - image_picker:
^1.2.3 - in_app_review:
^2.0.12 - in_app_update:
^5.0.0 - in_app_purchase:
^3.3.1 - intl:
^0.20.2 - live_activities:
^2.6.0 - livekit_client:
^2.13.0 - local_auth:
^3.0.2 - lottie:
^3.6.1 - marquee:
^2.3.0 - material_ui:
1.5.0 - metalink:
^2.1.0 - mime:
^2.1.0 - mobile_scanner:
^7.4.2 - objectbox:
^5.3.2 - objectbox_flutter_libs:
^5.3.2 - open_filex_plus:
^4.7.3 - path_provider:
^2.1.6 - path:
^1.9.1 - permission_handler:
^13.0.2 - photo_manager:
^3.10.0 - photo_view:
^0.15.0 - pro_image_editor:
^14.6.1 - qr_flutter:
^4.1.0 - receive_sharing_intent:
^1.9.0 - record:
^7.1.1 - screen_protector:
^1.5.3 - scroll_to_index:
^3.0.1 - share_plus:
^13.3.0 - shared_preferences:
^2.5.5 - shorebird_code_push:
^2.0.7 - sign_in_with_apple:
^8.2.0 - timezone:
^0.11.1 - translator:
^1.0.4+1 - url_launcher:
^6.3.2 - video_compress:
^3.1.4 - video_editor:
^3.0.0 - video_player:
^2.13.0 - video_thumbnail:
^0.5.6 - visibility_detector:
^0.4.0+2 - web_socket_channel:
^3.0.3 - youtube_player_flutter:
^9.1.3