Files
MABEA/flutter_app/README.md
T
patrickandClaude Sonnet 5 0909dacf2b
CI / backend-tests (push) Successful in 1m5s
CI / frontend-build (push) Successful in 18s
Flutter-Tests: ApiClient, Offline-Queue, Login-/Objektliste-Widgets
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
2026-09-04 18:38:17 +02:00

69 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.