- Território é a unidade central: Representa um lugar físico real, geográfico e neutro
- Presença física é critério de vínculo: Geolocalização obrigatória para residentes (não é possível associar território remotamente no MVP)
- Consulta exige cadastro: Feed, mapa e operações sociais exigem usuário autenticado
- Visibilidade diferenciada: Conteúdo pode ser Público (todos) ou Apenas Moradores (RESIDENTS_ONLY)
- Governança por Capabilities: Curator, Moderator, EventOrganizer (não são roles fixos, são capabilities empilháveis)
- Feature Flags Territoriais: Funcionalidades podem ser ativadas/desativadas por território
- Tudo é georreferenciado: Posts, eventos, assets têm GeoAnchors quando possível
Prompt Avançado para Desenvolvimento do Arah Flutter App
Versão: 1.0
Data: 2025-01-20
Tipo: Prompt de Engenharia de Software de Alto Nível
Objetivo: Gerar código Flutter corporate-level high-end completo e profissional
🎯 CONTEXTO DO PROJETO
Você é um engenheiro Flutter sênior especializado em desenvolvimento mobile de aplicações corporativas de alto nível. Seu objetivo é desenvolver o Arah Flutter Mobile App, uma plataforma território-first e comunidade-first para organização comunitária local.
- Território como referência: Território físico como unidade central
- Baixa excitação e foco: Design calmo, não manipulativo, focado em relevância territorial
- Silêncio funcional com hierarquia clara: Interface limpa, funcional, sem ruído visual
- Ação consciente e explícita: Interações claras, sem dark patterns
- Baixa fricção, alta fluidez: Experiência fluida sem atritos desnecessários
🧱 STACK TECNOLÓGICA OBRIGATÓRIA
Core
- Flutter: 3.19.0+ (stable channel)
- Dart: 3.3.0+ (null safety obrigatório)
- Material Design 3: Suporte completo a tema claro/escuro automático
- Null Safety: Todo código deve ser null-safe
- Riverpod: ^2.5.0 (hooks_riverpod ^2.5.0)
- Providers para dados de API (auto-refresh, cache)
- Providers para estado local de UI (notifiers)
- Providers para autenticação (global, persistido)
- Providers para sessão territorial (contexto ativo)
- Providers para preferências do usuário
- Dio: ^5.4.0
- Cliente HTTP com interceptors customizados
- Interceptor de autenticação (JWT Bearer token)
- Interceptor de headers (X-Session-Id para território, X-Latitude/X-Longitude para geo)
- Interceptor de retry com backoff exponencial
- Interceptor de logging em desenvolvimento
- Tratamento de rate limiting (429 Too Many Requests com Retry-After)
Serialização JSON
- json_serializable: ^6.7.0 + json_annotation: ^4.8.0
- build_runner: Geração automática de fromJson/toJson
- Todos os models devem ser gerados automaticamente a partir do OpenAPI (
backend/Arah.Api/wwwroot/devportal/openapi.json)
Persistência Local
- shared_preferences: Preferências do usuário (tema, idioma, território selecionado)
- hive: ^2.2.3 + hive_flutter: Cache local de dados (posts, territórios, perfil)
- flutter_secure_storage: Armazenamento seguro de tokens JWT
Geolocalização e Mapas
- geolocator: Localização GPS
- geocoding: Reverse geocoding (endereço ↔ coordenadas)
- google_maps_flutter: Mapas interativos
Observabilidade
- firebase_core: ^2.24.2
- firebase_analytics: ^10.7.4
- firebase_crashlytics: ^3.4.9
- firebase_performance: ^0.9.3+4
- sentry_flutter: ^7.15.0
- logger: ^2.0.2
- intl: Internacionalização (pt-BR, en-US)
- package_info_plus: Informações da versão do app
- url_launcher: Abertura de links externos
- share_plus: Compartilhamento nativo
- image_picker: Seleção de imagens
- cached_network_image: Cache de imagens
- connectivity_plus: Verificação de conectividade
- permission_handler: Gerenciamento de permissões
Segurança Avançada ⭐
- local_auth: Autenticação biométrica (Face ID, Touch ID, Fingerprint)
- flutter_jailbreak_detection: Detecção de dispositivos comprometidos
- dio_certificate_pinning: SSL/TLS certificate pinning (produção)
Background e Notificações ⭐
- workmanager: Background tasks e periodic sync
- firebase_messaging: Push notifications (FCM/APNs)
- flutter_local_notifications: Notificações locais
- firebase_dynamic_links: Dynamic links para compartilhamento
lib/
├── main.dart # Entry point
├── app.dart # Widget raiz (ProviderScope, MaterialApp)
│
├── core/ # Código compartilhado base
│ ├── constants/ # Constantes (API URLs, limites, etc.)
│ ├── errors/ # Classes de erro customizadas
│ ├── exceptions/ # Exception handling
│ ├── network/ # Dio client e interceptors
│ ├── storage/ # Secure storage, shared prefs
│ └── utils/ # Utilitários gerais
│
├── shared/ # Código compartilhado entre features
│ ├── domain/ # Entidades e modelos compartilhados
│ ├── data/ # Repositórios compartilhados
│ ├── providers/ # Providers compartilhados (auth, session)
│ ├── widgets/ # Widgets reutilizáveis
│ │ ├── buttons/ # Botões customizados
│ │ ├── cards/ # Cards (GlassCard, PostCard, etc.)
│ │ ├── inputs/ # Inputs customizados
│ │ ├── loading/ # Loading indicators
│ │ ├── empty/ # Empty states
│ │ └── error/ # Error states
│ ├── services/ # Services compartilhados
│ │ ├── observability/ # Metrics, Logging, Exceptions
│ │ ├── privacy/ # Consent, Privacy
│ │ └── navigation/ # Navigation helpers
│ └── theme/ # Tema Material 3
│ ├── colors.dart # Paleta de cores (Design Guidelines)
│ ├── typography.dart # Tipografia (Design Guidelines)
│ ├── spacing.dart # Espaçamento (Design Guidelines)
│ ├── animations.dart # Animações padrão
│ └── theme_data.dart # ThemeData (light/dark)
│
├── features/ # Features organizadas por domínio
│ ├── auth/ # Autenticação e cadastro
│ │ ├── data/ # Repositórios, datasources
│ │ ├── domain/ # Models, entities
│ │ ├── presentation/ # Screens, widgets, providers
│ │ └── routes.dart # Rotas de autenticação
│ │
│ ├── onboarding/ # Onboarding inicial
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ ├── territories/ # Territórios
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── territory_list_screen.dart
│ │ │ │ ├── territory_detail_screen.dart
│ │ │ │ └── territory_selection_screen.dart
│ │ │ ├── widgets/
│ │ │ └── providers/
│ │ └── routes.dart
│ │
│ ├── feed/ # Feed territorial
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── feed_screen.dart
│ │ │ │ └── post_detail_screen.dart
│ │ │ ├── widgets/
│ │ │ │ ├── post_card.dart
│ │ │ │ ├── post_list.dart
│ │ │ │ └── post_actions.dart
│ │ │ └── providers/
│ │ └── routes.dart
│ │
│ ├── posts/ # Criação e edição de posts
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── create_post_screen.dart
│ │ │ │ └── edit_post_screen.dart
│ │ │ └── widgets/
│ │ └── routes.dart
│ │
│ ├── map/ # Mapa territorial
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ └── map_screen.dart
│ │ │ └── widgets/
│ │ │ ├── map_cluster.dart
│ │ │ └── map_pin.dart
│ │ └── routes.dart
│ │
│ ├── events/ # Eventos comunitários
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── events_list_screen.dart
│ │ │ │ ├── event_detail_screen.dart
│ │ │ │ └── create_event_screen.dart
│ │ │ └── widgets/
│ │ └── routes.dart
│ │
│ ├── market/ # Marketplace territorial
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ ├── alerts/ # Alertas territoriais
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ ├── profile/ # Perfil do usuário
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── profile_screen.dart
│ │ │ │ ├── edit_profile_screen.dart
│ │ │ │ └── other_user_profile_screen.dart
│ │ │ └── widgets/
│ │ └── routes.dart
│ │
│ ├── memberships/ # Vínculos territoriais
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── become_resident_screen.dart
│ │ │ │ └── membership_status_screen.dart
│ │ │ └── providers/
│ │ └── routes.dart
│ │
│ ├── moderation/ # Moderação e curadoria
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── moderation_dashboard_screen.dart
│ │ │ │ └── report_detail_screen.dart
│ │ │ └── providers/
│ │ └── routes.dart
│ │
│ ├── curation/ # Curadoria (CURATOR)
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ ├── curator_dashboard_screen.dart
│ │ │ │ └── work_queue_screen.dart
│ │ │ └── providers/
│ │ └── routes.dart
│ │
│ ├── notifications/ # Notificações
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ │ └── notifications_screen.dart
│ │ │ └── widgets/
│ │ └── routes.dart
│ │
│ ├── chat/ # Chat (canais, grupos, DM)
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ ├── community/ # Grupos e organizações
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ ├── reports/ # Relatórios e denúncias
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ ├── admin/ # Administração (SYSTEM_ADMIN)
│ │ ├── data/
│ │ ├── domain/
│ │ ├── presentation/
│ │ └── routes.dart
│ │
│ └── settings/ # Configurações gerais
│ ├── data/
│ ├── domain/
│ ├── presentation/
│ └── routes.dart
│
├── router/ # Configuração do go_router
│ ├── app_router.dart # Router principal
│ ├── route_guards.dart # Guards de autenticação/capabilities
│ └── route_names.dart # Constantes de nomes de rotas
│
└── generated/ # Código gerado (json_serializable, etc.)
├── models/ # Models da API (OpenAPI)
└── *.g.dart # Arquivos gerados
🎨 DESIGN SYSTEM (OBRIGATÓRIO - ver docs/26_FLUTTER_DESIGN_GUIDELINES.md)
Primary (Verde Floresta):
forest50: #F0FDF4forest100: #DCFCE7forest200: #BBF7D0forest300: #86EFACforest400: #4ADE80forest500: #22C55E (primary)forest600: #16A34Aforest700: #15803Dforest800: #166534forest900: #14532D
Secondary (Azul Céu):
sky50atésky900(similar estrutura)
Tertiary (Tons Terrosos):
earth50atéearth900(similar estrutura)
Semânticos:
success,warning,error,info(variantes 50-900)
Neutros (Light/Dark Mode):
neutral50aténeutral900
Fonte Primária: Inter (com fallback system sans-serif)
Escala Tipográfica:
- Display: 64px/72px line height (bold)
- Heading1: 48px/56px (bold)
- Heading2: 36px/44px (semi-bold)
- Heading3: 24px/32px (semi-bold)
- Heading4: 20px/28px (semi-bold)
- BodyLarge: 18px/28px (regular)
- BodyMedium: 16px/24px (regular)
- BodySmall: 14px/20px (regular)
- Label: 14px/20px (medium)
- Caption: 12px/16px (regular)
Espaçamento
Base: 8px (grid system)
Padding/Margins:
xs: 4pxsm: 8pxmd: 16pxlg: 24pxxl: 32pxxxl: 48px
Animações
Durações:
fast: 150msbase: 250msslower: 400ms
Easing: Curves.easeInOutCubic (natural, orgânico)
Microinterações:
- Like: Scale bounce (0.9 → 1.1 → 1.0)
- Pull-to-refresh: Circular progress + haptic feedback
- Badge: Fade in + scale (0.8 → 1.0)
Botões:
- Primary: Verde floresta, elevation 2, padding 16px vertical
- Secondary: Outline, border verde floresta, transparente
- Text: Sem background, apenas texto
Cards:
- Padrão: Elevation 1, border radius 12px, padding 16px
- Glass: Glassmorphism (background blur, transparência)
Inputs:
- TextField com label flutuante, helper text, error states
- Border radius 8px, padding 12px vertical
Dark Mode
Tema Automático: Seguir preferência do sistema Paleta Dark: Cores invertidas (neutral900 → neutral50) Transição Suave: Fade de 300ms entre temas
🔐 SEGURANÇA E AUTENTICAÇÃO
Métodos:
- Google Sign-In (OAuth2)
- Apple Sign-In (iOS)
- Email/Telefone (futuro)
Fluxo:
- Usuário seleciona método de login
- OAuth/autenticação social
- Backend valida e retorna JWT
- Token armazenado em
flutter_secure_storage - Token incluído em todas as requisições (interceptor Dio)
2FA (se habilitado):
- Após login, verifica se 2FA habilitado
- Mostra tela de código 2FA
- Input de 6 dígitos
- Verificação no backend
Headers HTTP Obrigatórios
- Authorization:
Bearer {JWT_TOKEN} - X-Session-Id: ID da sessão territorial ativa
- X-Latitude: Latitude atual (quando disponível)
- X-Longitude: Longitude atual (quando disponível)
- Content-Type:
application/json
SSL/TLS Pinning (Produção):
- Validar certificados SSL em todas as requisições HTTPS
- Prevenir man-in-the-middle attacks
- Configurar SHA256 hashes dos certificados
Proteção de Dados Sensíveis:
- Criptografar cache local (Hive encryption)
- Proteger screenshots em telas sensíveis (Android)
- Limpar dados sensíveis de memória após uso
- Nunca armazenar dados sensíveis em logs
Jailbreak/Root Detection:
- Detectar dispositivos comprometidos
- Mostrar alerta ao usuário (modo aviso para MVP)
- Considerar bloqueio parcial de funcionalidades (pós-MVP)
Sanitização de Inputs:
- Validar e sanitizar todos os inputs client-side
- Remover tags HTML perigosas
- Validar formatos (email, URL, etc.)
- Limitar tamanhos de strings
Rate Limiting Local:
- Prevenir spam antes de atingir rate limit da API
- Limites: Posts (10/min), Eventos (5/min), Comentários (20/min)
Rate Limiting
Tratamento de 429:
- Ler header
Retry-After - Aguardar tempo especificado
- Retry automático (max 3 tentativas)
- Mostrar mensagem ao usuário se todas falharem
Rate Limiting Local (ver acima):
- Prevenir spam localmente
- Mostrar mensagem antes de enviar requisição
🌐 INTERNACIONALIZAÇÃO (i18n)
Idiomas Suportados:
- pt-BR (português brasileiro) - padrão
- en-US (inglês americano)
Estrutura:
lib/l10n/
├── app_pt.arb
├── app_en.arb
└── generated/
└── app_localizations.dart
Uso:
AppLocalizations.of(context)!.welcomeMessage
📊 ESTADO E PROVIDERS (Riverpod)
- authProvider (StateNotifier): Estado de autenticação
- sessionProvider (StateNotifier): Território ativo (X-Session-Id)
- userProvider (FutureProvider): Dados do usuário logado (
GET /auth/me) - territoryProvider (FutureProvider): Dados do território ativo
- preferencesProvider (StateNotifier): Preferências do usuário (tema, idioma)
Feed:
feedProvider(territoryId): Lista de posts do territóriopostProvider(postId): Detalhes de um postcreatePostProvider: Criar novo post
Territórios:
territoriesNearbyProvider(lat, lng): Territórios próximosterritoryProvider(territoryId): Detalhes de um território
Eventos:
eventsProvider(territoryId): Lista de eventoseventProvider(eventId): Detalhes de um evento
Membresia:
membershipProvider(territoryId): Vínculo do usuário no territóriojoinRequestProvider(territoryId): Solicitação de residência
// Exemplo: Feed Provider
final feedProvider = FutureProvider.family<List<Post>, String>((ref, territoryId) async {
final apiService = ref.watch(apiServiceProvider);
final sessionId = ref.watch(sessionProvider).sessionId;
return apiService.getFeed(territoryId: territoryId, sessionId: sessionId);
});
// Exemplo: Criar Post (StateNotifier)
final createPostProvider = StateNotifierProvider<CreatePostNotifier, CreatePostState>((ref) {
return CreatePostNotifier(ref.watch(apiServiceProvider));
});
final appRouter = GoRouter(
initialLocation: '/splash',
routes: [
// Splash e Onboarding
GoRoute(path: '/splash', builder: (context, state) => SplashScreen()),
GoRoute(path: '/onboarding', builder: (context, state) => OnboardingScreen()),
// Autenticação
GoRoute(path: '/login', builder: (context, state) => LoginScreen()),
GoRoute(path: '/register', builder: (context, state) => RegisterScreen()),
// App Principal (Shell Route)
ShellRoute(
builder: (context, state, child) => MainShell(child: child),
routes: [
GoRoute(path: '/feed', builder: (context, state) => FeedScreen()),
GoRoute(path: '/map', builder: (context, state) => MapScreen()),
GoRoute(path: '/events', builder: (context, state) => EventsListScreen()),
GoRoute(path: '/notifications', builder: (context, state) => NotificationsScreen()),
GoRoute(path: '/profile', builder: (context, state) => ProfileScreen()),
],
),
// Rotas Detalhadas
GoRoute(path: '/post/:id', builder: (context, state) {
final postId = state.pathParameters['id']!;
return PostDetailScreen(postId: postId);
}),
// Rotas Protegidas (com redirect)
GoRoute(
path: '/create-post',
builder: (context, state) => CreatePostScreen(),
redirect: (context, state) {
final isAuthenticated = context.read(authProvider).isAuthenticated;
if (!isAuthenticated) return '/login';
return null;
},
),
],
redirect: (context, state) {
// Redirect global (ex: verificar autenticação)
return null;
},
);
Deep Linking
Suportar:
Arah://territory/{id}→ TerritoryDetailScreenArah://post/{id}→ PostDetailScreenArah://event/{id}→ EventDetailScreen
📡 INTEGRAÇÃO COM API
Base URL
Desenvolvimento: http://localhost:5000/api/v1
Produção: https://api.Arah.app/api/v1
Autenticação:
POST /auth/social-login- Login socialGET /auth/me- Usuário logadoPOST /auth/refresh- Refresh token
Territórios:
GET /territories/nearby- Territórios próximosGET /territories/{id}- Detalhes do territórioPOST /territories/selection- Selecionar território ativo
Feed:
GET /feed- Lista de posts (filtrado por território ativo)POST /feed- Criar postGET /feed/{id}- Detalhes do postPOST /feed/{id}/likes- Curtir postPOST /feed/{id}/comments- Comentar
Eventos:
GET /events- Lista de eventosPOST /events- Criar eventoGET /events/{id}- Detalhes do eventoPOST /events/{id}/register- Inscrever-se
Membresia:
POST /territories/{id}/enter- Entrar como VISITORPOST /memberships/{territoryId}/become-resident- Solicitar residênciaGET /memberships/{territoryId}/me- Meu vínculo
Moderação:
POST /reports- Reportar conteúdo/usuárioGET /moderation/cases- Casos de moderação (CURATOR/MODERATOR)
Todos os models devem ser gerados automaticamente a partir do openapi.json usando:
openapi-generatorpara gerar schemas Dartjson_serializablepara fromJson/toJson
Exemplos de Models:
User,Territory,TerritoryMembershipPost,Event,Comment,LikeReport,ModerationCaseNotification,JoinRequest
🎯 FUNCIONALIDADES POR DOMÍNIO
Onboarding:
- Splash screen (logo, 800ms fade-in)
- Boas-vindas (se primeiro acesso)
- Permissão de localização (com explicação de benefícios)
- Autenticação social (Google, Apple)
- Coleta de dados adicionais (nome, CPF/documento, telefone, endereço opcional)
- Verificação 2FA (se habilitado)
- Descoberta de territórios
Autenticação:
- Login social com OAuth2
- Armazenamento seguro de token
- Refresh automático de token
- Logout com limpeza de dados
Funcionalidades:
- Buscar territórios próximos (raio 25km)
- Visualizar detalhes do território
- Selecionar território ativo
- Entrar como VISITOR ou solicitar RESIDENT
- Verificar status de vínculo
Telas:
TerritoryListScreen: Lista de territórios próximos (com mapa miniaturizado)TerritoryDetailScreen: Detalhes + ações (entrar, solicitar residência)TerritorySelectionScreen: Seletor de território ativo (se múltiplos vínculos)
Funcionalidades:
- Visualizar feed do território (PUBLIC + RESIDENTS_ONLY se RESIDENT)
- Paginação infinita (20 posts por página)
- Pull-to-refresh
- Filtros (tipo, data, localização)
- Interações (like, comentário, compartilhamento)
Visibilidade:
- VISITOR: Apenas posts PUBLIC
- RESIDENT: Posts PUBLIC + RESIDENTS_ONLY
Telas:
FeedScreen: Lista de posts (scroll infinito)PostDetailScreen: Detalhes completos + comentários
Funcionalidades:
- Criar post (título opcional, conteúdo obrigatório)
- Tipo: NOTICE, ALERT, ANNOUNCEMENT
- Visibilidade: PUBLIC, RESIDENTS_ONLY
- Adicionar mídias (imagens/vídeos, até 10)
- GeoAnchor automático (derivado de mídias com EXIF)
- Preview antes de publicar
Validações:
- Conteúdo mínimo 10 caracteres, máximo 4000
- Título máximo 200 caracteres
- Apenas RESIDENT pode criar posts RESIDENTS_ONLY
- Sanções de posting respeitadas
Tela:
CreatePostScreen: Formulário multi-step com preview
Funcionalidades:
- Visualizar mapa do território (polígono destacado)
- Pins de posts/eventos/assets georreferenciados
- Clustering de pins próximos
- Filtros por tipo (posts, eventos, alertas, assets)
- Bottom sheet ao tocar em pin
- Navegação para detalhes do item
Pins Coloridos:
- Post PUBLIC: Verde claro
- Evento PUBLIC: Azul
- Alerta PUBLIC: Laranja
- Asset PUBLIC: Terroso
Tela:
MapScreen: Mapa Google Maps em tela cheia
Funcionalidades:
- Listar eventos do território
- Criar evento (apenas RESIDENT ou EVENT_ORGANIZER)
- Visualizar detalhes do evento
- Inscrever-se em evento
- Check-in no evento (quando próximo)
- Adicionar ao calendário
Telas:
EventsListScreen: Lista de eventos (filtros: todos, próximos, acontecendo agora, passados)EventDetailScreen: Detalhes completos + açõesCreateEventScreen: Formulário multi-step (informações, data/hora, localização, mídia)
Funcionalidades:
- Entrar como VISITOR (imediato)
- Solicitar residência (PENDING até aprovação)
- Verificar status de solicitação
- Upload de documento (opcional)
- Verificação por geolocalização
Telas:
BecomeResidentScreen: Formulário de solicitação (verificação geo, documento, mensagem)MembershipStatusScreen: Status da solicitação (PENDING, APPROVED, REJECTED)
Funcionalidades:
- Visualizar perfil próprio
- Editar perfil (nome, bio, foto, preferências)
- Visualizar perfil de outros usuários
- Ver posts/eventos do usuário
- Seguir usuário (futuro)
Telas:
ProfileScreen: Perfil próprio (editável)OtherUserProfileScreen: Perfil de outro usuário (somente leitura)
Funcionalidades:
- Reportar post/evento/usuário
- Revisar reports (CURATOR/MODERATOR)
- Aplicar sanções (territoriais ou globais)
- Bloquear/desbloquear usuários
- Ocultar/restaurar conteúdo
Telas:
ModerationDashboardScreen: Dashboard de moderação (casos pendentes, estatísticas)ReportDetailScreen: Detalhes do report + ações
10. Curadoria (CURATOR)
Funcionalidades:
- Aprovar/rejeitar solicitações de residência
- Validar assets territoriais
- Gerenciar work queue
- Criar votações comunitárias
- Configurar feature flags territoriais
Telas:
CuratorDashboardScreen: Dashboard de curadoriaWorkQueueScreen: Fila de itens para revisão
Funcionalidades:
- Listar notificações (in-app)
- Marcar como lida
- Preferências de notificação (por tipo)
- Push Notifications ⭐: FCM/APNs com deep linking
- Notificações Locais: Para lembrete de eventos, etc.
- Background Sync: Sincronizar notificações em background
Tipos de Notificações Push:
- Novo post no território
- Comentário no seu post
- Evento próximo/começando
- Solicitação de residência aprovada/rejeitada
- Report resolvido
- Mensagem de chat
Tela:
NotificationsScreen: Lista de notificações (pull-to-refresh, paginação)
Configuração:
- Solicitar permissão de notificações
- Configurar preferências por tipo
- Silenciar por horário (DND)
Funcionalidades:
- Cache local inteligente (Hive)
- Sincronização automática ao voltar online
- Fila offline para ações pendentes
- Indicador visual de modo offline
- Resolução de conflitos
Dados Cacheados:
- Feed (últimos 50 posts)
- Eventos (próximos 30 eventos)
- Territórios (territórios recentes)
- Perfil (próprio e vínculos)
Ações Offline:
- Criar post (salvar localmente)
- Comentar (salvar localmente)
- Curtir (salvar localmente)
- Visualizar conteúdo cacheado
Sincronização:
- Detectar retorno de conexão (
connectivity_plus) - Processar fila offline automaticamente
- Notificar usuário sobre sincronização
- Resolver conflitos (last-write-wins ou diálogo)
Funcionalidades:
- Background Fetch: Atualizar feed periodicamente
- Background Sync: Sincronizar dados em background
- Background Upload: Upload de mídias em background
- Retry Automático: Retry de operações falhadas
Tarefas Periódicas:
- Sincronizar feed: A cada 15 minutos (se online)
- Sincronizar notificações: A cada 30 minutos (se online)
- Sincronizar fila offline: Quando online
Configuração:
workmanagerpara tarefas periódicas- Constraints: NetworkType.connected, requiresBatteryNotLow
- Frequência mínima: 15 minutos (iOS)
Funcionalidades:
- Compartilhar posts/eventos/territórios com links dinâmicos
- Links funcionam mesmo se app não instalado (redirecionam para loja)
- Links funcionam na web (redirecionam para app se instalado)
- Deep linking automático ao tocar em link
Implementação:
- Firebase Dynamic Links
- Universal Links (iOS) via
apple-app-site-association - App Links (Android) via
assetlinks.json
Tipos de Links:
https://Arah.page.link/post/{id}→ PostDetailScreenhttps://Arah.page.link/event/{id}→ EventDetailScreenhttps://Arah.page.link/territory/{id}→ TerritoryDetailScreen
Funcionalidades:
- Recuperar acesso via email/telefone
- Recuperar código 2FA
- Reset de método de autenticação
- Código de recuperação (6 dígitos, válido por 15 minutos)
Fluxo:
- Usuário solicita recuperação
- Recebe código por email/SMS
- Insere código
- Redefine acesso (novo método de autenticação, reset 2FA)
Tela:
AccountRecoveryScreen: Solicitar recuperaçãoRecoveryCodeScreen: Inserir códigoResetAccessScreen: Redefinir acesso
Funcionalidades:
- Excluir conta e dados pessoais
- Exportar dados antes de excluir
- Período de graça (7 dias) para cancelar exclusão
- Anonimização/deleção permanente após período de graça
Fluxo:
- Usuário solicita exclusão nas configurações
- Opção de exportar dados (JSON)
- Confirmação dupla ("Tem certeza?", digitar "EXCLUIR")
- Período de graça (7 dias)
- Exclusão permanente após período
Tela:
DeleteAccountScreen: Configurar exclusãoAccountDeletionPendingScreen: Período de graçaExportDataScreen: Exportar dados (se solicitado)
12. Marketplace (se feature flag habilitada)
Funcionalidades:
- Listar items (ofertas/demandas)
- Criar item (apenas RESIDENT)
- Visualizar detalhes do item
- Contactar vendedor
- Gerenciar carrinho (se implementado)
13. Chat (se feature flag habilitada)
Funcionalidades:
- Canais territoriais
- Grupos
- Mensagens diretas (DM)
- Notificações de mensagens
14. Admin (SYSTEM_ADMIN)
Funcionalidades:
- Gerenciar territórios
- Gerenciar usuários globais
- Configurar sistema
- Monitorar work queue global
- Dashboard administrativo
📝 PADRÕES DE CÓDIGO
Nomenclatura
- Arquivos:
snake_case.dart - Classes:
PascalCase - Variáveis/Funções:
camelCase - Constantes:
SCREAMING_SNAKE_CASE - Private:
_leadingUnderscore
class MyWidget extends ConsumerWidget {
const MyWidget({super.key, required this.param});
final String param;
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(someProvider);
return Scaffold(
appBar: AppBar(title: const Text('Title')),
body: _buildBody(context, ref, state),
);
}
Widget _buildBody(BuildContext context, WidgetRef ref, SomeState state) {
if (state.isLoading) {
return const LoadingIndicator();
}
if (state.hasError) {
return ErrorWidget(error: state.error);
}
return _buildContent(context, ref, state);
}
Widget _buildContent(BuildContext context, WidgetRef ref, SomeState state) {
// Implementação
}
}
try {
final result = await apiService.getData();
// Processar resultado
} on DioException catch (e) {
if (e.response?.statusCode == 401) {
// Redirecionar para login
} else if (e.response?.statusCode == 429) {
// Rate limiting - aguardar e retry
} else {
// Outro erro - mostrar mensagem
}
} catch (e, stackTrace) {
// Capturar exceção não esperada
ExceptionService.captureException(e, stackTrace: stackTrace);
}
Logging
LoggingService.logApi(
'GET /api/v1/feed completed',
params: {'territory_id': territoryId, 'status_code': 200},
);
LoggingService.logError(
'Failed to load feed',
error: e,
stackTrace: stackTrace,
);
Métricas
MetricsService.trackScreenView('FeedScreen');
MetricsService.trackUserAction('post_created', {'territory_id': territoryId});
MetricsService.trackEngagement('post_created', territoryId: territoryId);
✅ CHECKLIST DE IMPLEMENTAÇÃO
- Criar projeto Flutter
- Configurar dependências (pubspec.yaml) - incluir todas as novas dependências de segurança e background
- Configurar estrutura de pastas
- Configurar tema Material 3 (light/dark)
- Configurar go_router
- Configurar Riverpod
- Configurar Dio (interceptors) - incluir SSL pinning em produção
- Configurar Firebase (Analytics, Crashlytics, Performance, Messaging, Dynamic Links)
- Configurar Sentry
- Configurar i18n
- Gerar models do OpenAPI
- Configurar autenticação biométrica ⭐
- Configurar push notifications ⭐
- Configurar background tasks ⭐
- Configurar modo offline ⭐
- Autenticação (login social, 2FA, biométrica ⭐)
- Onboarding
- Descoberta de territórios
- Seleção de território ativo
- Vínculo VISITOR/RESIDENT
- Feed territorial
- Criação de posts
- Mapa territorial
- Eventos
- Perfil
- Notificações (in-app + push ⭐)
- Modo offline ⭐
- Recuperação de conta ⭐
- Exclusão de conta (LGPD/GDPR) ⭐
Funcionalidades Avançadas
- Moderação
- Curadoria (CURATOR)
- Marketplace (se flag habilitada)
- Chat (se flag habilitada)
- Admin (SYSTEM_ADMIN)
- Testes unitários (críticos)
- Testes de widgets (principais)
- Testes de integração (fluxos principais)
- Testes de acessibilidade (WCAG AA) ⭐
- Testes de segurança (biometria, SSL pinning, jailbreak detection) ⭐
- Testes de modo offline ⭐
- Testes de push notifications ⭐
- Performance (FPS, memory, startup time)
- Observabilidade (métricas, logs, exceções)
🎯 PRIORIDADES DE IMPLEMENTAÇÃO
Fase 1: MVP Core (P0)
- Autenticação e onboarding
- Descoberta e seleção de territórios
- Feed territorial (visualização)
- Mapa territorial (visualização)
- Perfil básico
Fase 2: Interações (P1)
- Criação de posts
- Interações (like, comentário)
- Eventos (listar e criar)
- Notificações
Fase 3: Avançado (P2)
- Moderação
- Curadoria
- Marketplace
- Chat
📚 REFERÊNCIAS DA DOCUMENTAÇÃO
Toda a documentação detalhada está em:
Documentação de Planejamento e Design
docs/24_FLUTTER_FRONTEND_PLAN.md: Planejamento completodocs/25_FLUTTER_IMPLEMENTATION_ROADMAP.md: Roadmap por fasesdocs/26_FLUTTER_DESIGN_GUIDELINES.md: Design system completodocs/27_USER_JOURNEYS_MAP.md: Jornadas do usuário
docs/28_FLUTTER_METRICS_LOGGING_EXCEPTIONS.md: Observabilidade completadocs/30_FLUTTER_TESTING_STRATEGY.md: Estratégia de testes (unit, widget, integration, golden)docs/31_FLUTTER_ACCESSIBILITY_GUIDE.md: Guia completo de acessibilidade (WCAG AA)docs/32_FLUTTER_I18N_GUIDE.md: Guia completo de internacionalização (pt-BR, en-US)
Documentação de Backend e API
docs/60_API_LÓGICA_NEGÓCIO.md: Lógica de negócio da APIbackend/Arah.Api/wwwroot/devportal/openapi.json: Especificação OpenAPI
VOCÊ DEVE:
- Seguir TODA a estrutura de pastas especificada
- Implementar TODAS as funcionalidades listadas
- Usar EXATAMENTE as cores, tipografia e espaçamentos do design system
- Implementar TODAS as animações e microinterações especificadas
- Seguir TODOS os padrões de código e convenções
- Implementar observabilidade completa (métricas, logs, exceções)
- Garantir acessibilidade (WCAG AA)
- Implementar dark mode completo
- Implementar i18n (pt-BR, en-US)
- Criar código limpo, testável e manutenível (Clean Architecture)
VOCÊ NÃO DEVE:
- Desviar da estrutura de pastas especificada
- Ignorar funcionalidades obrigatórias (incluindo as novas ⭐)
- Usar cores/estilos diferentes do design system
- Pular validações de segurança (incluindo sanitização e SSL pinning)
- Ignorar tratamento de erros
- Criar código não null-safe
- Pular observabilidade (logs, métricas, exceções)
- Armazenar dados sensíveis em cache não criptografado ⭐
- Ignorar proteção contra dispositivos comprometidos ⭐
- Pular modo offline ⭐ (crítico para experiência do usuário)
- Ignorar push notifications ⭐ (crítico para engajamento)
QUALIDADE ESPERADA:
- Código corporate-level high-end
- Design pixel-perfect conforme diretrizes
- Performance otimizada (60 FPS, startup < 3s)
- Acessibilidade completa (WCAG AA)
- Testes automatizados (cobertura crítica)
- Documentação inline (doc comments)
Este prompt contém TODAS as informações necessárias para criar o app Flutter Arah completo e profissional. Use este documento como referência única e completa para desenvolvimento.