# MABEA Android-App (Flutter) – erstes Grundgerüst Zweiter Client derselben API (Prompt 19 API-first-Prinzip) neben der React-PWA (`frontend/`). Deckt Login, Objektliste, Kontroll-Screen (Start/Sperre-Übernahme/ Positionen/Abschluss/Abbruch) sowie eine Offline-Queue (Prompt 17-Härtung, `lib/offline/queue.dart`, sqflite) ab. ## Wichtig: Plattform-Ordner fehlen noch Dieses Verzeichnis enthält nur `lib/`, `pubspec.yaml`, `analysis_options.yaml` - die von `flutter create` generierten Plattform-Ordner (`android/`, `ios/`, Gradle- Konfiguration etc.) wurden bewusst NICHT von Hand nachgebaut, da das ohne Testlauf zu fehleranfällig wäre. Erstinbetriebnahme auf dem Zielsystem (mit Flutter-SDK installiert): ```bash cd flutter_app flutter create . --platforms android --org de.perlbach24 --project-name mabea_app # überschreibt pubspec.yaml NICHT automatisch mit *nix cp -n, ggf. lib/-Inhalt # und pubspec.yaml-Dependencies danach gegen diese Version abgleichen flutter pub get flutter build apk ``` ## API-Adresse `lib/main.dart`: `kApiBaseUrl` ist aktuell fest auf den Deployment-Server (`192.168.1.238`) gesetzt. Für Produktivbetrieb auf `--dart-define` umstellen oder zumindest vor jedem Build prüfen/anpassen. ## Kamera-Berechtigung (Kamera-Scan, Karte 10) `mobile_scanner` braucht die Kamera-Berechtigung im generierten `android/`-Ordner (existiert erst nach `flutter create .`, siehe oben) - nach dem Erstlauf einmalig in `android/app/src/main/AndroidManifest.xml` ergänzen, oberhalb von ``: ```xml ``` Für iOS entsprechend in `ios/Runner/Info.plist`: ```xml NSCameraUsageDescription Wird zum Scannen von Objekt-/Geräte-Codes benötigt. ``` ## Offline-Queue (Prompt 17-Härtung) `lib/offline/queue.dart`: Positionen werden lokal in sqflite zwischengespeichert (`enqueue`), Status je Eintrag (`wartet`/`wird_uebertragen`/`fehler`), Sync bei Reconnect (`connectivity_plus`) und periodisch alle 15s - gleiches Muster wie `frontend/src/offline/queue.ts` (IndexedDB), nur die lokale DB ist anders. `KontrollScreen` gleicht per 2s-Reconciliation-Loop den Anzeigezustand mit der Queue ab, Abschluss ist gesperrt, solange Einträge offen sind. ## Tests ```bash flutter test ``` `http.Client` ist per Konstruktor injizierbar (`ApiClient(httpClient: ...)`), Tests mocken ihn mit `mocktail` statt echten Netzwerkaufrufen - kein Server/Emulator nötig. `test/offline_queue_test.dart` nutzt `sqflite_common_ffi` (reines Dart, keine Plattform-Channels), um die sqflite-Queue ohne Gerät/Emulator zu testen. Deckt ab: `ApiClient` (Login, Token-Header, Fehlerfälle), Offline-Queue (Erfolg/Netzwerkfehler/ 4xx-kein-Retry), Login-Screen und Objektliste-Suche als Widget-Tests.