Skip to content

Commit 0ef82f5

Browse files
committed
save change mode
1 parent ff76f3e commit 0ef82f5

File tree

5 files changed

+152
-1
lines changed

5 files changed

+152
-1
lines changed

lib/app_theme.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
11
import 'package:flutter/material.dart';
22

3+
const String THEME_MODE = 'theme';
4+
const String COLOR_MODE = 'color';
5+
36
/// theme mode
47
enum AppThemeMode {
58
Light,
69
Dark,
710
}
811

12+
AppThemeMode getInitThemeMode(String mode) {
13+
AppThemeMode appThemeMode = AppThemeMode.values
14+
.firstWhere((element) => element.toString() == mode, orElse: null);
15+
if (appThemeMode == null) {
16+
appThemeMode = AppThemeMode.Light;
17+
}
18+
return appThemeMode;
19+
}
20+
21+
AppThemeColorMode getInitColorMode(String mode) {
22+
AppThemeColorMode colorMode = AppThemeColorMode.values
23+
.firstWhere((element) => element.toString() == mode, orElse: null);
24+
if (colorMode == null) {
25+
colorMode = AppThemeColorMode.Blue;
26+
}
27+
return colorMode;
28+
}
29+
930
///字体模式
1031
enum AppFontMode {
1132
///默认字体

lib/blocs/theme/theme_bloc.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:bloc/bloc.dart';
2+
import 'package:shared_preferences/shared_preferences.dart';
23
import 'package:timefly/app_theme.dart';
34
import 'package:timefly/blocs/theme/theme_event.dart';
45
import 'package:timefly/blocs/theme/theme_state.dart';
@@ -19,6 +20,17 @@ class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {
1920
AppTheme.appTheme
2021
.setThemeState(state.themeMode, state.themeColorMode, state.fontMode);
2122
yield state;
23+
} else if (event is ThemeLoadEvnet) {
24+
SharedPreferences shared = await SharedPreferences.getInstance();
25+
AppThemeMode appThemeMode =
26+
getInitThemeMode(shared.getString(THEME_MODE));
27+
AppThemeColorMode colorMode =
28+
getInitColorMode(shared.getString(COLOR_MODE));
29+
ThemeState state =
30+
ThemeState(appThemeMode, colorMode, AppFontMode.Roboto);
31+
AppTheme.appTheme
32+
.setThemeState(state.themeMode, state.themeColorMode, state.fontMode);
33+
yield state;
2234
}
2335
}
2436
}

lib/blocs/theme/theme_event.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,8 @@ class ThemeChangeEvent extends ThemeEvent {
1515
final AppThemeColorMode themeColorMode;
1616
final AppFontMode fontMode;
1717
}
18+
19+
class ThemeLoadEvnet extends ThemeEvent {
20+
@override
21+
List<Object> get props => [];
22+
}

lib/main.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:timefly/app_theme.dart';
77
import 'package:timefly/blocs/habit/habit_bloc.dart';
88
import 'package:timefly/blocs/habit/habit_event.dart';
99
import 'package:timefly/blocs/theme/theme_bloc.dart';
10+
import 'package:timefly/blocs/theme/theme_event.dart';
1011
import 'package:timefly/blocs/theme/theme_state.dart';
1112
import 'package:timefly/home_screen.dart';
1213
import 'package:timefly/notification/notification_plugin.dart';
@@ -33,7 +34,7 @@ class MyApp extends StatelessWidget {
3334
@override
3435
Widget build(BuildContext context) {
3536
return BlocProvider<ThemeBloc>(
36-
create: (context) => ThemeBloc(),
37+
create: (context) => ThemeBloc()..add(ThemeLoadEvnet()),
3738
child: BlocProvider<HabitsBloc>(
3839
create: (context) => HabitsBloc()..add(HabitsLoad()),
3940
child: BlocBuilder<ThemeBloc, ThemeState>(

lib/mine/settings_screen.dart

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import 'package:flutter/material.dart';
33
import 'package:flutter/services.dart';
44
import 'package:flutter_bloc/flutter_bloc.dart';
55
import 'package:flutter_svg/svg.dart';
6+
import 'package:shared_preferences/shared_preferences.dart';
67
import 'package:timefly/blocs/theme/theme_bloc.dart';
8+
import 'package:timefly/blocs/theme/theme_event.dart';
79
import 'package:timefly/blocs/theme/theme_state.dart';
810
import 'package:timefly/models/user.dart';
911
import 'package:timefly/utils/system_util.dart';
1012
import 'package:timefly/widget/custom_edit_field.dart';
1113

1214
import '../app_theme.dart';
15+
import 'change_theme_screen.dart';
1316

1417
class SettingsScreen extends StatefulWidget {
1518
@override
@@ -23,6 +26,11 @@ class _SettingsScreenState extends State<SettingsScreen> {
2326
builder: (context, state) {
2427
SystemUtil.changeStateBarMode(
2528
AppTheme.appTheme.isDark() ? Brightness.light : Brightness.dark);
29+
30+
AppThemeMode appThemeMode = state.themeMode;
31+
AppThemeColorMode appThemeColorMode = state.themeColorMode;
32+
AppFontMode appFontMode = state.fontMode;
33+
2634
return Scaffold(
2735
body: Container(
2836
color: AppTheme.appTheme.containerBackgroundColor(),
@@ -44,6 +52,24 @@ class _SettingsScreenState extends State<SettingsScreen> {
4452
),
4553
),
4654
ChangeUserInfoView(),
55+
DarkModeView(
56+
appThemeMode: appThemeMode,
57+
appThemeColorMode: appThemeColorMode,
58+
appFontMode: appFontMode,
59+
),
60+
SizedBox(
61+
height: 32,
62+
),
63+
ThemeColorView(
64+
currentColorMode: appThemeColorMode,
65+
onTap: (colorMode) async {
66+
BlocProvider.of<ThemeBloc>(context).add(ThemeChangeEvent(
67+
appThemeMode, colorMode, appFontMode));
68+
SharedPreferences shared =
69+
await SharedPreferences.getInstance();
70+
shared.setString(COLOR_MODE, colorMode.toString());
71+
},
72+
),
4773
SizedBox(
4874
height: 100,
4975
)
@@ -175,3 +201,89 @@ class _ChangeUserInfoViewState extends State<ChangeUserInfoView> {
175201
);
176202
}
177203
}
204+
205+
class DarkModeView extends StatefulWidget {
206+
final AppThemeMode appThemeMode;
207+
final AppThemeColorMode appThemeColorMode;
208+
209+
final AppFontMode appFontMode;
210+
211+
const DarkModeView(
212+
{Key key, this.appThemeMode, this.appThemeColorMode, this.appFontMode})
213+
: super(key: key);
214+
215+
@override
216+
State<StatefulWidget> createState() {
217+
return _DarkModeViewState();
218+
}
219+
}
220+
221+
///切换暗黑模式
222+
class _DarkModeViewState extends State<DarkModeView> {
223+
bool checked = false;
224+
225+
@override
226+
void initState() {
227+
checked = widget.appThemeMode == AppThemeMode.Dark;
228+
super.initState();
229+
}
230+
231+
@override
232+
Widget build(BuildContext context) {
233+
return Container(
234+
margin: EdgeInsets.only(top: 32, left: 22, right: 22),
235+
padding: EdgeInsets.all(32),
236+
decoration: BoxDecoration(
237+
shape: BoxShape.rectangle,
238+
borderRadius: BorderRadius.all(Radius.circular(15)),
239+
color: AppTheme.appTheme.cardBackgroundColor(),
240+
boxShadow: AppTheme.appTheme.containerBoxShadow()),
241+
child: Row(
242+
children: [
243+
Column(
244+
crossAxisAlignment: CrossAxisAlignment.start,
245+
children: [
246+
Text(
247+
'${checked ? '开' : '关'}',
248+
style: AppTheme.appTheme
249+
.headline1(fontSize: 18, fontWeight: FontWeight.bold),
250+
),
251+
SizedBox(
252+
height: 6,
253+
),
254+
Text(
255+
'黑夜模式',
256+
style: AppTheme.appTheme.headline1(
257+
fontWeight: FontWeight.bold,
258+
fontSize: 16,
259+
textColor:
260+
AppTheme.appTheme.normalColor().withOpacity(0.5)),
261+
)
262+
],
263+
),
264+
Expanded(child: SizedBox()),
265+
Checkbox(
266+
value: checked,
267+
activeColor: AppTheme.appTheme.grandientColorStart(),
268+
onChanged: (value) async {
269+
SharedPreferences shared =
270+
await SharedPreferences.getInstance();
271+
setState(() {
272+
checked = value;
273+
BlocProvider.of<ThemeBloc>(context).add(ThemeChangeEvent(
274+
checked ? AppThemeMode.Dark : AppThemeMode.Light,
275+
widget.appThemeColorMode,
276+
widget.appFontMode));
277+
278+
shared.setString(
279+
THEME_MODE,
280+
checked
281+
? AppThemeMode.Dark.toString()
282+
: AppThemeMode.Light.toString());
283+
});
284+
})
285+
],
286+
),
287+
);
288+
}
289+
}

0 commit comments

Comments
 (0)