ApiClient nimmt jetzt einen injizierbaren http.Client entgegen (Testbarkeit, kein Verhaltensunterschied im Betrieb). Tests mocken ihn mit mocktail statt echter Netzwerkaufrufe. offline_queue_test.dart nutzt sqflite_common_ffi (reines Dart) für die Queue-Logik ohne Gerät/Emulator: Erfolg entfernt Eintrag, Netzwerkfehler bleibt "wartet", 4xx setzt "fehler" ohne Auto-Retry. Dazu Widget-Tests für Login-Flow und Objektliste-Suchfilter. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
69 lines
2.7 KiB
Markdown
69 lines
2.7 KiB
Markdown
# 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 `<application>`:
|
||
|
||
```xml
|
||
<uses-permission android:name="android.permission.CAMERA" />
|
||
```
|
||
|
||
Für iOS entsprechend in `ios/Runner/Info.plist`:
|
||
|
||
```xml
|
||
<key>NSCameraUsageDescription</key>
|
||
<string>Wird zum Scannen von Objekt-/Geräte-Codes benötigt.</string>
|
||
```
|
||
|
||
## 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.
|