feat(umgebung): Server-Umgebung im Login-Screen waehlbar (Produktion/Test)

- Umgebungen (Name, API-URL, Keycloak-Issuer) kommen aus
  assets/hl_server_config.json statt hartcodiertem BackendConfig.prod;
  Testumgebung 192.168.1.9:3001 ist dort hinterlegt
- AppBloc laedt die Config, aktiviert die gespeicherte Wahl (Fallback
  Default) und registriert das Networking; Wechsel persistiert per
  SharedPreferences und registriert neu
- Bloc-Baum ist pro Umgebung gekeyt: beim Wechsel entstehen alle Blocs
  mit dem neuen API-Client neu
- Login-Screen: Zahnrad oben rechts oeffnet Einstellungen mit Umgebungs-
  Cards (Name + IP:Port); Hinweis auf aktive Umgebung unter dem Button
- Fahrzeugauswahl pro Umgebung getrennt (eigene DB = eigene Car-IDs)
- Tests fuer Config-Parsing, Auswahl-Fallback, Card-Wechsel, Re-Registrierung

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-25 13:06:49 +02:00
parent c239cdfd3e
commit f832b69b9d
17 changed files with 717 additions and 72 deletions

View File

@ -4,6 +4,7 @@ import 'package:get_it/get_it.dart';
import 'package:hl_lieferservice/bloc/app_bloc.dart';
import 'package:hl_lieferservice/bloc/app_events.dart';
import 'package:hl_lieferservice/data/cache/attachment_cache.dart';
import 'package:hl_lieferservice/data/network/environment_repository.dart';
import 'package:hl_lieferservice/data/network/network_locator.dart';
import 'package:hl_lieferservice/feature/settings/bloc/settings_bloc.dart';
import 'package:hl_lieferservice/feature/settings/bloc/settings_event.dart';
@ -12,19 +13,23 @@ import 'package:hl_lieferservice/widget/app.dart';
final locator = GetIt.instance;
void main() {
// Backend-Migration Phase A: HTTP-Stack + Token-Provider registrieren,
// bevor irgendein Bloc starten kann. Wirft eine Compile-Sicherheit
// hin, dass `HolzleitnerApi` ab hier per `locator<HolzleitnerApi>()`
// verfügbar ist.
registerNetworking(locator: locator);
// Das Networking (HTTP-Stack + Token-Provider) registriert der AppBloc,
// sobald die Umgebung aus `assets/hl_server_config.json` feststeht. Alle
// Konsumenten von `locator<HolzleitnerApi>()` entstehen erst danach
// (Bloc-Baum wird erst bei `AppConfigLoaded` gebaut).
// Persistenter Vorschau-Cache für Attachment-Bilder. Über die gesamte
// App-Lebensdauer stabil und zustandslos (das Verzeichnis löst er lazy
// selbst auf), daher hier als Singleton.
locator.registerSingleton<AttachmentCache>(AttachmentCache());
runApp(MultiBlocProvider(providers: [
BlocProvider(create: (context) => AppBloc(),),
BlocProvider(
create: (context) => AppBloc(
repository: EnvironmentRepository(),
activate: (config) =>
registerNetworking(locator: locator, config: config),
),
),
BlocProvider(create: (context) => SettingsBloc())
], child: App()));
}