diff --git a/.gitignore b/.gitignore index 72b10a9..7595e3e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.claude/ + test/flutter_test_project/.gitignore test/flutter_test_project/.metadata test/flutter_test_project/analysis_options.yaml diff --git a/CLAUDE.md b/CLAUDE.md index 6dd053e..bbc6934 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,10 +60,19 @@ dart run build_runner build (im `app/`-Verzeichnis; `--delete-conflicting-outputs` wird von der installierten build_runner-Version ignoriert und ist nicht nötig). -**Entschiedene Pakete** (siehe Doku Abschnitt 8): `flutter_map` + `flutter_map_tile_caching` -(nicht `google_maps_flutter`), `drift`, `flutter_bloc` + `flutter_riverpod` (kombiniert: -Bloc für die App-Mode State Machine, Riverpod für reaktive Einzelwerte wie Telemetrie), -`go_router`. +**Entschiedene Pakete** (siehe Doku Abschnitt 8): `flutter_map` (nicht `google_maps_flutter`), +`drift`, `flutter_bloc` + `flutter_riverpod` (kombiniert: Bloc für die App-Mode State +Machine, Riverpod für reaktive Einzelwerte wie Telemetrie), `go_router`. + +**`flutter_map_tile_caching` (FMTC, Doku 4.18) ist aktuell NICHT in der pubspec** — +FMTC 10.1.1 pinnt `objectbox_flutter_libs: ^4.1.0` fest, und diese Version hat einen +AAR-Metadata-Konflikt mit neueren AndroidX-Transitiv-Dependencies (`androidx.fragment`, +`androidx.window`, `androidx.activity` verlangen compileSdk ≥34, `objectbox_flutter_libs` +selbst ist gegen android-31 kompiliert) → Build schlägt fehl +(`checkReleaseAarMetadata`). Da FMTC im Code noch nirgends verwendet wird, wurde es +vorerst entfernt statt mit ungetesteten `dependency_overrides` zu forcieren. Vor +erneutem Hinzufügen: prüfen, ob FMTC eine neuere Version mit `objectbox_flutter_libs ^5.x` +freigegeben hat. **Noch nicht umgesetzt / bewusst zurückgestellt:** - Eigener MSP-Encoder/Decoder in Dart (4.19) — kein fertiges Paket verfügbar. @@ -71,8 +80,25 @@ Bloc für die App-Mode State Machine, Riverpod für reaktive Einzelwerte wie Tel Protokoll-Adapter zu verifizieren. - `SurveyAreaMission`/`SearchAreaMission` (Strategy-Pattern vorgesehen, Details offen). - Foreground Service (Android) für Hintergrund-Telemetrie (4.20). +- Offline-Kartenkachel-Caching (FMTC, siehe oben) — Paket-Versionskonflikt zu lösen. - `flutter_launcher_icons` ist konfiguriert für Android; iOS ist aus MVP-Gründen deaktiviert (`ios: false` in der `flutter_launcher_icons`-Sektion der `pubspec.yaml`). +- `web/`-Plattform ist nur für schnelle lokale UI-Vorschau hinzugefügt (kein Android- + Emulator/Gerät nötig), nicht Teil des Release-Scopes. + +## Bekannte Windows-Stolpersteine beim Android-Build + +- **Projekt liegt auf D:, Gradle-/Kotlin-Nutzerverzeichnis auf C:** → Kotlins + inkrementeller Compiler crasht beim Schließen der Caches + (`Could not close incremental caches ... this and base files have different roots`). + Fix bereits gesetzt: `kotlin.incremental=false` in `android/gradle.properties`. +- **`flutter run -d --release`** ist der zuverlässigste Weg, einen + Android-Emulator/Gerät aus diesem (nicht-interaktiven) Environment heraus zu + bespielen — Debug-Modus mit Hot-Reload funktioniert nur in einer echten + interaktiven Session (VS Code, Terminal). +- **`adb shell`/`adb pull` mit absoluten Unix-Pfaden (`/sdcard/...`) in Git Bash**: + MSYS wandelt den führenden Slash-Pfad fälschlich in einen Windows-Pfad um. Fix: + Pfad mit doppeltem Slash schreiben (`//sdcard/datei.png`). ## Verifikation nach Änderungen @@ -81,3 +107,11 @@ Im `app/`-Verzeichnis: flutter analyze flutter test ``` + +Für einen echten Lauf auf Android (z. B. Emulator `Pixel_10a`, angelegt mit dem +`pixel_10`-Geräteprofil als Näherung, da kein exaktes "Pixel 10a"-Profil im SDK +existiert): +``` +flutter emulators --launch Pixel_10a +flutter run -d emulator-5554 --release +``` diff --git a/app/.metadata b/app/.metadata index d312f63..2557b48 100644 --- a/app/.metadata +++ b/app/.metadata @@ -15,7 +15,7 @@ migration: - platform: root create_revision: 058e0af2c2b57e369d905a03ac9748b0ebf543c6 base_revision: 058e0af2c2b57e369d905a03ac9748b0ebf543c6 - - platform: android + - platform: web create_revision: 058e0af2c2b57e369d905a03ac9748b0ebf543c6 base_revision: 058e0af2c2b57e369d905a03ac9748b0ebf543c6 diff --git a/app/android/gradle.properties b/app/android/gradle.properties index e96108c..a9a759d 100644 --- a/app/android/gradle.properties +++ b/app/android/gradle.properties @@ -1,5 +1,11 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true +# Projekt liegt auf D:, Gradle/Kotlin-Nutzerverzeichnis standardmaessig auf C: - +# Kotlins inkrementeller Compiler bricht beim Schliessen der Caches ab, wenn +# Projekt- und Cache-Pfad auf unterschiedlichen Laufwerken liegen ("this and +# base files have different roots"). Inkrementelle Kotlin-Kompilierung daher +# deaktiviert (etwas langsamere Rebuilds, aber stabil). +kotlin.incremental=false # This newDsl flag was added by the Flutter template android.newDsl=false # This builtInKotlin flag was added by the Flutter template diff --git a/app/pubspec.lock b/app/pubspec.lock index bbe2346..c58ee62 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -273,14 +273,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" - flat_buffers: - dependency: transitive - description: - name: flat_buffers - sha256: "380bdcba5664a718bfd4ea20a45d39e13684f5318fcd8883066a55e21f37f4c3" - url: "https://pub.dev" - source: hosted - version: "23.5.26" flutter: dependency: "direct main" description: flutter @@ -318,14 +310,6 @@ packages: url: "https://pub.dev" source: hosted version: "8.3.1" - flutter_map_tile_caching: - dependency: "direct main" - description: - name: flutter_map_tile_caching - sha256: "90e097223d8ab74425cf15b449a03adfa4d4c28406dc757e1c396aff0f9beba7" - url: "https://pub.dev" - source: hosted - version: "10.1.1" flutter_riverpod: dependency: "direct main" description: @@ -576,22 +560,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" - objectbox: - dependency: transitive - description: - name: objectbox - sha256: "3cc186749178a3556e1020c9082d0897d0f9ecbdefcc27320e65c5bc650f0e57" - url: "https://pub.dev" - source: hosted - version: "4.3.1" - objectbox_flutter_libs: - dependency: transitive - description: - name: objectbox_flutter_libs - sha256: cd754766e04229a4f51250f121813d9a3c1a74fc21cd68e48b3c6085cbcd6c85 - url: "https://pub.dev" - source: hosted - version: "4.3.1" objective_c: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index c9d895e..2ba1f4e 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -42,7 +42,6 @@ dependencies: cupertino_icons: ^1.0.8 flutter_map: ^8.3.1 latlong2: ^0.9.1 - flutter_map_tile_caching: ^10.1.1 drift: ^2.34.2 sqlite3_flutter_libs: ^0.6.0+eol path_provider: ^2.1.6 diff --git a/app/web/favicon.png b/app/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/app/web/favicon.png differ diff --git a/app/web/icons/Icon-192.png b/app/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/app/web/icons/Icon-192.png differ diff --git a/app/web/icons/Icon-512.png b/app/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/app/web/icons/Icon-512.png differ diff --git a/app/web/icons/Icon-maskable-192.png b/app/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/app/web/icons/Icon-maskable-192.png differ diff --git a/app/web/icons/Icon-maskable-512.png b/app/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/app/web/icons/Icon-maskable-512.png differ diff --git a/app/web/index.html b/app/web/index.html new file mode 100644 index 0000000..84148f5 --- /dev/null +++ b/app/web/index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + dmc_app + + + + + + + diff --git a/app/web/manifest.json b/app/web/manifest.json new file mode 100644 index 0000000..d043d99 --- /dev/null +++ b/app/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "dmc_app", + "short_name": "dmc_app", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +}