Themes
In Flutter, a theme is a set of pre-defined colors, fonts, and other design properties that can be applied to an entire app or specific widgets within the app.The main benefit of using themes is that they provide a consistent and visually appealing appearance throughout the app.XFlutter-CLI tool comes with 2 main themes (Light Theme/Dark Theme) with ability to switch current theme with Theme Notifier.
Initialize Theme:
To share a Theme across your entire app, set the theme property to your MaterialApp constructorvoid main() async {
  // initialize app dependencies
  await configureAppDependencies(environment: environment);
  runApp(const MyApp());
}
class MyApp extends StatefulWidget {
  const MyApp({super.key});
  @override
  State<MyApp> createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    final themeMode = GetIt.instance<ThemeNotifier>(); // current ThemeMode from theme_notifier.dart
    return MaterialApp(
      theme: lightTheme, // from theme.dart
      darkTheme: darkTheme, // from dark_theme.dart
      themeMode: themeMode,
      // ...
    );
  }
}Change Current Theme:
To switch Light/Dark theme you can call `toggleThemeMode` from `ThemeNotifier`class MyWidget extends StatelessWidget {
  const MyWidget({super.key});
  @override
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: () {
        final ThemeNotifier themeNotifier = GetIt.instance<ThemeNotifier>();
        themeNotifier.toggleThemeMode();
      },
      child: const Text('Change Theme'),
    );
  }
}Detect Current Theme Changes:
You can handle switching current theme with 2 options:1. LiveDataBuilder
Wrap Your MaterialApp with LiveDataBuilder:class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return LiveDataBuilder<ThemeMode>( // add LiveDataBuilder here
      data: GetIt.instance<ThemeNotifier>().themeMode,
      builder: (context, themeMode) => MaterialApp.router(
        routerDelegate: appRouter.delegate(),
        routeInformationParser: appRouter.defaultRouteParser(),
        theme: lightTheme,
        darkTheme: darkTheme,
        themeMode: themeMode,
        locale: context.locale,
        debugShowCheckedModeBanner: false,
        supportedLocales: context.supportedLocales,
        localizationsDelegates: context.localizationDelegates,
      ),
    );
  }
}2. Event Driven:
You can listen for changes with `EventBus`:import 'events/event_bus.dart';
class MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // change Material-App current theme
    eventBus.on<ThemeChangedEvent>().listen((_) {
        // handle changes
    });
  } 
}