import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'app_lifecycle_lock.dart'; import '../models/settings.dart'; import '../viewmodels/pin_lock_view_model.dart'; import '../viewmodels/settings_view_model.dart'; import '../theme.dart'; import '../l10n/app_localizations.dart'; class KoolTabApp extends StatefulWidget { const KoolTabApp({super.key, required this.router}); final GoRouter router; @override State createState() => _KoolTabAppState(); } class _KoolTabAppState extends State { late final AppLifecycleLockObserver _lifecycleLockObserver; @override void initState() { super.initState(); _lifecycleLockObserver = AppLifecycleLockObserver( onLock: () => context.read().lock(), shouldLock: () => context.read().settings.autoLockEnabled, ); WidgetsBinding.instance.addObserver(_lifecycleLockObserver); WidgetsBinding.instance.addPostFrameCallback((_) { context.read().ensureLoaded(); }); } @override void dispose() { WidgetsBinding.instance.removeObserver(_lifecycleLockObserver); super.dispose(); } @override Widget build(BuildContext context) { final settings = context.watch().settings; return MaterialApp.router( onGenerateTitle: (context) => AppLocalizations.of(context).appTitle, debugShowCheckedModeBanner: false, routerConfig: widget.router, locale: _localeFor(settings.language), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, theme: lightTheme, darkTheme: _themeFor(settings.themeMode), themeMode: _mapThemeMode(settings.themeMode, context), ); } ThemeMode _mapThemeMode(AppThemeMode mode, BuildContext context) { final hasLoaded = context.read().hasLoaded; return switch (mode) { AppThemeMode.dark => ThemeMode.dark, AppThemeMode.light => ThemeMode.light, AppThemeMode.ugly => ThemeMode.dark, AppThemeMode.system => hasLoaded ? ThemeMode.system : ThemeMode.dark, }; } ThemeData _themeFor(AppThemeMode mode) { return switch (mode) { AppThemeMode.ugly => uglyTheme, _ => darkTheme, }; } Locale? _localeFor(AppLanguage language) { return switch (language) { AppLanguage.system => null, AppLanguage.english => const Locale('en'), AppLanguage.dutch => const Locale('nl'), }; } }