Skip to content

Commit e078f07

Browse files
authored
Merge pull request #12 from FriesI23/feat/theme-mode
feat: support follow system theme in theme toggle
2 parents 7319280 + 58e24de commit e078f07

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed
Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,52 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
23
import 'package:running_services_monitor/core/dependency_injection/dependency_injection.dart';
34
import 'package:running_services_monitor/core/extensions.dart';
45
import 'package:running_services_monitor/core/theme/theme_bloc.dart';
56

67
class ThemeToggleButton extends StatelessWidget {
78
const ThemeToggleButton({super.key});
89

10+
AppThemeMode getNextThemeMode(AppThemeMode themeMode, Brightness brightness) {
11+
switch (themeMode) {
12+
case AppThemeMode.light:
13+
return brightness == Brightness.light
14+
? AppThemeMode.dark
15+
: AppThemeMode.system;
16+
case AppThemeMode.dark:
17+
return brightness == Brightness.light
18+
? AppThemeMode.system
19+
: AppThemeMode.light;
20+
case AppThemeMode.system:
21+
return brightness == Brightness.light
22+
? AppThemeMode.light
23+
: AppThemeMode.dark;
24+
}
25+
}
26+
27+
void onPressed(AppThemeMode themeMode, Brightness brightness) {
28+
final newThemeMode = getNextThemeMode(themeMode, brightness);
29+
getIt<ThemeBloc>().add(ThemeEvent.setTheme(mode: newThemeMode));
30+
}
31+
932
@override
1033
Widget build(BuildContext context) {
11-
final brightness = Theme.of(context).brightness; // Already cached effectively
12-
final isDark = brightness == Brightness.dark;
13-
return IconButton(
14-
icon: Icon(isDark ? Icons.light_mode : Icons.dark_mode),
15-
onPressed: () {
16-
getIt<ThemeBloc>().add(ThemeEvent.toggleTheme(isDark: isDark));
34+
return BlocSelector<ThemeBloc, AppThemeMode, AppThemeMode>(
35+
bloc: getIt<ThemeBloc>(),
36+
selector: (state) => state,
37+
builder: (context, themeMode) {
38+
final brightness = MediaQuery.platformBrightnessOf(context);
39+
final icon = switch (themeMode) {
40+
AppThemeMode.light => const Icon(Icons.light_mode),
41+
AppThemeMode.dark => const Icon(Icons.dark_mode),
42+
_ => const Icon(Icons.brightness_auto),
43+
};
44+
return IconButton(
45+
icon: icon,
46+
onPressed: () => onPressed(themeMode, brightness),
47+
tooltip: context.loc.toggleTheme,
48+
);
1749
},
18-
tooltip: context.loc.toggleTheme,
1950
);
2051
}
2152
}

0 commit comments

Comments
 (0)