From 71fccb237f887c14c153fae1a32c60a4a50f281e Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 19 Jan 2022 16:06:03 +0100 Subject: [PATCH] Add automatically determine theme feature --- lib/bloc/theme/theme_bloc.dart | 12 ++++++------ lib/main.dart | 34 ++++++++++++++++++++++++++++++++-- lib/screens/settings.dart | 17 +++++++++++++---- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/lib/bloc/theme/theme_bloc.dart b/lib/bloc/theme/theme_bloc.dart index b34b5a7..2b7c43b 100644 --- a/lib/bloc/theme/theme_bloc.dart +++ b/lib/bloc/theme/theme_bloc.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:get_it/get_it.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import '../../models/themes/theme.dart'; +import '../../settings.dart'; export 'package:flutter_bloc/flutter_bloc.dart'; export 'package:jisho_study_tool/models/themes/theme.dart'; @@ -19,12 +19,12 @@ class ThemeBloc extends Bloc { ), ); + final bool autoThemeIsDark = + SchedulerBinding.instance!.window.platformBrightness == Brightness.dark; + add( SetTheme( - themeIsDark: GetIt.instance - .get() - .getBool('darkThemeEnabled') ?? - false, + themeIsDark: autoThemeEnabled ? autoThemeIsDark : darkThemeEnabled, ), ); } diff --git a/lib/main.dart b/lib/main.dart index e26f372..610e5e6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,6 +10,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'bloc/theme/theme_bloc.dart'; import 'routing/router.dart'; +import 'settings.dart'; Future setupDatabase() async { final Directory appDocDir = await getApplicationDocumentsDirectory(); @@ -35,14 +36,43 @@ Future main() async { runApp(const MyApp()); } -class MyApp extends StatelessWidget { +class MyApp extends StatefulWidget { const MyApp({Key? key}) : super(key: key); + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State with WidgetsBindingObserver { + final ThemeBloc themeBloc = ThemeBloc(); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance?.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance?.removeObserver(this); + super.dispose(); + } + + @override + void didChangePlatformBrightness() { + if (autoThemeEnabled) { + final themeIsDark = + WidgetsBinding.instance?.window.platformBrightness == Brightness.dark; + themeBloc.add(SetTheme(themeIsDark: themeIsDark)); + } + super.didChangePlatformBrightness(); + } + @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (context) => ThemeBloc()), + BlocProvider(create: (context) => themeBloc), ], child: BlocBuilder( builder: (context, themeState) => MaterialApp( diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 16deeab..2fea4fd 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -24,6 +24,18 @@ class _SettingsViewState extends State { } } + // ignore: avoid_positional_boolean_parameters + void toggleAutoTheme(bool b) { + final bool newThemeIsDark = b + ? WidgetsBinding.instance!.window.platformBrightness == Brightness.dark + : darkThemeEnabled; + + BlocProvider.of(context) + .add(SetTheme(themeIsDark: newThemeIsDark)); + + setState(() => autoThemeEnabled = b); + } + @override Widget build(BuildContext context) { final TextStyle _titleTextStyle = TextStyle( @@ -56,11 +68,8 @@ class _SettingsViewState extends State { tiles: [ SettingsTile.switchTile( title: 'Automatically determine theme', - onToggle: (b) { - setState(() => autoThemeEnabled = b); - }, + onToggle: toggleAutoTheme, switchValue: autoThemeEnabled, - enabled: false, switchActiveColor: AppTheme.jishoGreen.background, ), SettingsTile.switchTile(