import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'core/localization/app_localizations.dart';
import 'core/navigation/deep_link.dart';
import 'core/theme/app_theme.dart';
import 'core/theme/app_scroll_behavior.dart';
import 'data/app_data_scope.dart';
import 'data/app_data_store.dart';
import 'data/location_scope.dart';
import 'data/location_store.dart';
import 'features/splash/splash_page.dart';
import 'services/settings_service.dart';
import 'services/analytics_service.dart';
class MeinWeimarApp extends StatefulWidget {
const MeinWeimarApp({
super.key,
required this.settings,
});
final SettingsService settings;
@override
State<MeinWeimarApp> createState() => _MeinWeimarAppState();
}
class _MeinWeimarAppState extends State<MeinWeimarApp> {
final AppDataStore _store = AppDataStore();
final LocationStore _locationStore = LocationStore();
late final DeepLink _initialDeepLink = DeepLink.fromUri(Uri.base);
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_store.load(languageCode: widget.settings.locale.languageCode);
_locationStore.initialize();
});
}
@override
void dispose() {
_store.dispose();
_locationStore.dispose();
super.dispose();
}
void _ensureContentLanguage(String languageCode) {
final needsInitialLoad = _store.status == AppDataStatus.idle;
final canReload = _store.status == AppDataStatus.ready ||
_store.status == AppDataStatus.fallback;
if (needsInitialLoad ||
(canReload && _store.languageCode != languageCode)) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_store.load(languageCode: languageCode);
});
}
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: widget.settings,
builder: (context, _) {
final locale = widget.settings.locale;
_ensureContentLanguage(locale.languageCode);
return LocationScope(
store: _locationStore,
child: AppDataScope(
store: _store,
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'MeinWeimar City Guide',
theme: AppTheme.light,
scrollBehavior: const MeinWeimarScrollBehavior(),
locale: locale,
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
builder: (context, child) {
AnalyticsService.instance.setLanguage(locale.languageCode);
AnalyticsService.instance.updateContext(context);
return Listener(
behavior: HitTestBehavior.translucent,
onPointerDown: (_) =>
AnalyticsService.instance.markInteraction(),
child: child ?? const SizedBox.shrink(),
);
},
home: SplashPage(
settings: widget.settings, initialDeepLink: _initialDeepLink),
),
),
);
},
);
}
}

