Search code examples
flutterflutter-layoutflutter-providerflutter-theme

Dynamic Theme Change Based On System's Dark & Light Mode


I have been working on dynamic dark and light mode feature in flutter.

I want to change the app's theme as dark theme or light theme when i am changing the mobile system's dark/light mode from system settings.

But, I'm not able to change the app's dark or light mode based on Mobile System's light or dark mode.

I'm using the following code.

main.dart

    import 'package:flutter/material.dart';
    import 'package:flutterrookieapp/provider/ThemeProvider.dart';
    import 'package:flutterrookieapp/utils/AppTheme.dart';
    import 'package:provider/provider.dart';

    void main() => runApp(MyApp());

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(
              create: (context) => ThemeProvider(
                  MediaQuery.of(context).platformBrightness == Brightness.dark
                      ? darkTheme
                      : lightTheme),
            )
          ],
          child: Consumer<ThemeProvider>(
            builder: (temp, theme, _) {
              return MaterialApp(
                debugShowCheckedModeBanner: false,
                title: 'Flutter Sample',
                theme: MediaQuery.platformBrightnessOf(context) == Brightness.dark
                    ? darkTheme
                    : lightTheme,
                home: HomePage(),
              );
            },
          ),
        );
      }
    }
  }

ThemeProvider.dart

import 'package:flutter/material.dart';

class ThemeProvider with ChangeNotifier {
  ThemeData _themeData;

  ThemeProvider(this._themeData);

  ThemeData getTheme() => _themeData;

  setTheme(ThemeData themeData) async {
    this._themeData = themeData;
    notifyListeners();
  }
}

Solution

  • you can use in the MaterialApp the darkTheme or theme it's always from the mobile system setting

    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Sample',
      darkTheme: darkTheme,
      theme: lightTheme,
      home: HomePage(),
    ),