import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; import 'design/app_theme.dart'; import 'design/zen_style.dart'; import 'exercises/views/exercise_detail_view.dart'; import 'home/home_view.dart'; import 'localization/app_localizations.dart'; import 'plans/views/exercise_picker_view.dart'; import 'plans/views/plan_editor_view.dart'; import 'player/views/player_view.dart'; import 'player/views/summary_view.dart'; import 'settings/settings_controller.dart'; import 'settings/settings_view.dart'; class ZenXerciseApp extends StatelessWidget { const ZenXerciseApp({super.key}); @override Widget build(BuildContext context) { final mode = context.watch().mode; // The whole app morphs into the new Mode at that Mode's own pace. final style = ZenStyle.forMode(mode); return MaterialApp( theme: AppTheme.forMode(mode), themeAnimationDuration: style.motion, themeAnimationCurve: style.curve, restorationScopeId: 'app', localizationsDelegates: const [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: AppLocalizations.supportedLocales, onGenerateTitle: (context) => AppLocalizations.of(context).appTitle, // Status bar icons follow the Mode's ground on every screen, with or without an app bar. builder: (context, child) => AnnotatedRegion( value: style.brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark, child: child!, ), onGenerateRoute: (settings) => MaterialPageRoute( settings: settings, builder: (context) => switch (settings.name) { ExerciseDetailView.routeName => ExerciseDetailView(exerciseId: settings.arguments! as String), PlanEditorView.routeName => PlanEditorView(planId: settings.arguments! as String), ExercisePickerView.routeName => ExercisePickerView(planId: settings.arguments! as String), PlayerView.routeName => PlayerView(planId: settings.arguments! as String), SummaryView.routeName => switch (settings.arguments) { final SummaryArguments a => SummaryView(sessionId: a.sessionId, justFinished: a.justFinished), final id => SummaryView(sessionId: id! as String), }, SettingsView.routeName => const SettingsView(), _ => const HomeView(), }, ), ); } }