Skip to content

DOC

Créer une app Android native avec Flutter depuis une API (Happy et Fluke)

Orchestration d'une API complète (Happy) vers une app Android/Flutter production-ready (Fluke)

Créer une app Android native avec Flutter depuis une API (Happy et Fluke)

Contexte

Vous avez un produit web et vous voulez offrir une expérience native de première classe sur Android (téléphone, tablette, TV, Wear OS, Auto). Ce workflow orchestre deux agents : Happy conçoit l’API exhaustive adaptée à tous les clients, puis Fluke la consomme pour construire un starter kit Android/Flutter compilable, avec tests, et accompagne jusqu’au déploiement Google Play Store.

Prérequis

Phase 1 (Happy — API Design)

  • Projet web existant (Next.js, Rails, Django, etc.)
  • Stack backend documenté
  • Modèles et endpoints existants ou spécification préliminaire
  • Optionnel : OpenAPI 3.1 spec si API existe

Phase 2 (Fluke — Android Implementation)

  • Android Studio 2024.1+
  • Flutter SDK 3.24+ (ou Kotlin 2.0+ pour Compose)
  • Android API level: 24+
  • Google Play Developer account

Ecosystem Prerequisites

  • Happy génère docs/api/ (source de vérité)
  • Steve (iOS) et Fluke (Android) réutilisent la même docs/api/
  • Si Happy génère d’abord, Fluke skip la Phase 0 et commence directement

Étapes

1. Phase 1 : Conception API avec Happy

Invoquer Happy pour auditer et concevoir l’API :

/ulk:happy
# ou
happy
# ou
API design
# ou
concevoir API

Happy génère docs/api/ complète (voir 11-web-to-ios.md pour détails).

2. Phase 2 : Implémentation Android avec Fluke

Une fois docs/api/ généré, invoquer Fluke :

/ulk:fluke
# ou
fluke
# ou
Android app
# ou
Flutter
# ou
Google Play

3. Fluke Phase 0-1 : Diagnostic et setup

Fluke détecte Happy a déjà généré l’API :

🤖 Fluke — Orchestrateur Android
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Lisant docs/api/...
  ✅ OpenAPI 3.1 trouvé
  ✅ 12 endpoints détectés
  ✅ Auth: JWT Bearer
  ✅ Push: FCM (Firebase Cloud Messaging)

Platforms Android cibles:
  ✅ Phone (API 24+)
  ✅ Tablet (API 24+)
  ✅ TV (optional)
  ✅ Wear OS (optional)
  ✅ Auto (optional)

Stack choix:
  Option 1: Flutter + Dart (multiplateforme)
    → Unique codebase pour phone/tablet/wear/TV/Auto
  Option 2: Kotlin + Jetpack Compose (natif)
    → Performance maximale, compile Compose uniquement

Recommendation: Flutter (coûts maintenabilité réduits)

4. Fluke Phase 2-5 : Génération starter kit

Option A : Flutter :

my_app/
├── lib/
│   ├── main.dart                      # App root
│   ├── models/
│   │   ├── user.dart                  # JSON serializable
│   │   ├── post.dart
│   │   └── ...
│   ├── services/
│   │   ├── api_client.dart            # HTTP requests
│   │   ├── auth_service.dart          # JWT + OAuth2
│   │   ├── push_service.dart          # FCM
│   │   └── offline_sync_service.dart
│   ├── providers/
│   │   ├── user_provider.dart         # Riverpod/Provider
│   │   ├── post_provider.dart
│   │   └── auth_provider.dart
│   ├── screens/
│   │   ├── home_screen.dart
│   │   ├── user_list_screen.dart
│   │   ├── post_detail_screen.dart
│   │   ├── auth_screen.dart
│   │   └── settings_screen.dart
│   ├── widgets/
│   │   ├── user_tile.dart
│   │   ├── post_card.dart
│   │   └── ...
│   └── theme/
│       └── app_theme.dart
├── test/
│   ├── api_client_test.dart
│   ├── user_provider_test.dart
│   └── ...
├── pubspec.yaml                       # Dependencies
└── android/                           # Native Android config

Option B : Kotlin/Compose :

MyApp/
├── app/src/main/
│   ├── kotlin/com/example/myapp/
│   │   ├── MainActivity.kt
│   │   ├── models/
│   │   │   ├── User.kt
│   │   │   ├── Post.kt
│   │   │   └── ...
│   │   ├── api/
│   │   │   ├── ApiClient.kt
│   │   │   ├── AuthService.kt
│   │   │   └── PushService.kt
│   │   ├── viewmodel/
│   │   │   ├── UserListViewModel.kt
│   │   │   ├── PostDetailViewModel.kt
│   │   │   └── ...
│   │   ├── ui/
│   │   │   ├── screens/
│   │   │   ├── composables/
│   │   │   └── theme/
│   │   └── ...
│   └── res/
├── build.gradle.kts                   # Gradle config
└── ...

5. Fluke Phase 6 : Tests et déploiement

Fluke génère :

Tests Flutter :

test('APIClient fetches users', () async {
  final client = APIClient();
  final users = await client.request<List<User>>('/users');
  expect(users, isNotEmpty);
});

test('AuthService JWT refresh', () async {
  final auth = AuthService();
  final token = await auth.refreshToken();
  expect(token, isNotNull);
});

Deploy instructions :

# Build APK (phone)
flutter build apk --release

# Build AAB (Google Play)
flutter build appbundle --release

# Deploy via Fastlane
fastlane init                           # Setup
fastlane supply --aab build/app.aab --track internal

Exemple de sortie

api_client.dart (Flutter, généré) :

import 'package:http/http.dart' as http;
import 'dart:convert';

class APIClient {
  static const String baseURL = 'https://api.example.com';
  late http.Client _httpClient;
  String? _authToken;

  APIClient() {
    _httpClient = http.Client();
  }

  Future<T> request<T>(
    String endpoint, {
    String method = 'GET',
    dynamic body,
    required T Function(Map<String, dynamic>) fromJson,
  }) async {
    final url = Uri.parse('$baseURL$endpoint');
    final headers = {
      'Content-Type': 'application/json',
      if (_authToken != null) 'Authorization': 'Bearer $_authToken',
    };

    final response = await _httpClient.request(
      method,
      url,
      headers: headers,
      body: body != null ? jsonEncode(body) : null,
    );

    if (response.statusCode >= 200 && response.statusCode < 300) {
      final json = jsonDecode(response.body);
      return fromJson(json);
    } else {
      throw APIException('Request failed: ${response.statusCode}');
    }
  }

  void setAuthToken(String token) {
    _authToken = token;
  }
}

pubspec.yaml (Flutter, généré) :

name: my_app
description: Native Android app from Happy API

environment:
  sdk: '>=3.0.0 <4.0.0'

dependencies:
  flutter:
    sdk: flutter
  http: ^1.1.0
  riverpod: ^2.4.0
  flutter_riverpod: ^2.4.0
  json_serializable: ^6.7.1
  firebase_messaging: ^14.6.0
  flutter_secure_storage: ^9.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^3.0.0
  riverpod_generator: ^2.3.0
  build_runner: ^2.4.0

Variantes

  • Variante A : Kotlin/Compose au lieu de Flutter — Fluke génère projet Kotlin natif avec Jetpack Compose (performance max)
  • Variante B : Multi-form factor — Fluke configure tablets, Wear OS, TV, Auto dans la même app (layouts adaptatifs Flutter)
  • Variante C : Offline-first — Fluke implémente local storage (Hive, SQLite) + sync strategy pour offline support
  • Variante D : Réutiliser Steve’s docs/api/ — Si Steve (iOS) a déjà exécuté, Fluke trouve docs/api/ existant et skip Phase 1 complètement

Agents enchaînés

Flux orchestré (Happy → Fluke) :

Happy (mobile/49) — Conception API
  └─ Output : docs/api/ (OpenAPI 3.1)
       ↓ réutilisé par
Fluke (mobile/48) — Implémentation Android
  ├─ Phase 0 : Lire docs/api/ (5 min)
  ├─ Phase 1 : Déterminer stack (Flutter vs Kotlin, 5 min)
  ├─ Phase 2 : Setup Android Studio + Google Play (10 min)
  ├─ Phase 3 : Générer Models + Services (30 min)
  ├─ Phase 4 : Générer Screens + Providers (30 min)
  ├─ Phase 5 : Générer Tests (20 min)
  └─ Output : Android Studio project compilable + deploy instructions

Après iOS et Android :

Steve (27) + Fluke (48) utilisent la MÊME docs/api/
→ Zéro redéfinition, maintien unique pour tous les clients

Troubleshooting

SymptômeCause probableRésolution
”Happy API missing”Happy n’a pas été lancé avant FlukeLancer Happy d’abord via /ulk:happy
”Flutter SDK not found”Flutter non installé ou PATH mal configuréInstaller Flutter depuis flutter.dev, ajouter au PATH
”Google Play Developer account missing”Pas de compte enregistréCréer via play.google.com/console, configurer avec fastlane init
”FCM not working”Firebase project pas lié à l’app AndroidCréer Firebase project dans console.firebase.google.com, télécharger google-services.json, placer dans android/app/
“Kotlin compilation errors”Versions dépendances incompatiblesMettre à jour build.gradle.kts avec versions Fluke suggérées

Voir aussi

  • ./11-web-to-ios.md — Créer une app iOS/SwiftUI (même API, autre platform)
  • ./02-blackemperor-pre-release.md — Pre-release orchestrator (inclut Android deployment)
  • agents/mobile/49-happy.md — Documentation Happy (API design)
  • agents/mobile/48-fluke.md — Documentation Fluke (Android implementation)
  • agents/_shared/mobile-protocol.md — Protocole mobile complet
  • Google Play Console : https://play.google.com/console — Developer dashboard
  • Flutter Docs : https://flutter.dev/docs — Framework complet