- 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>
56 lines
2.0 KiB
Dart
56 lines
2.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
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';
|
|
import 'package:hl_lieferservice/widget/app.dart';
|
|
|
|
final locator = GetIt.instance;
|
|
|
|
void main() {
|
|
// 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(
|
|
repository: EnvironmentRepository(),
|
|
activate: (config) =>
|
|
registerNetworking(locator: locator, config: config),
|
|
),
|
|
),
|
|
BlocProvider(create: (context) => SettingsBloc())
|
|
], child: App()));
|
|
}
|
|
|
|
class App extends StatefulWidget {
|
|
const App({super.key});
|
|
|
|
@override
|
|
State<StatefulWidget> createState() => _AppState();
|
|
}
|
|
|
|
class _AppState extends State<App> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
context.read<AppBloc>().add(AppLoadConfig(path: "hl_server_config.json"));
|
|
context.read<SettingsBloc>().add(LoadSettings());
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return DeliveryApp();
|
|
}
|
|
} |