@@ -3,13 +3,16 @@ import 'package:flutter/material.dart';
33import 'package:flutter/services.dart' ;
44import 'package:flutter_bloc/flutter_bloc.dart' ;
55import 'package:flutter_svg/svg.dart' ;
6+ import 'package:shared_preferences/shared_preferences.dart' ;
67import 'package:timefly/blocs/theme/theme_bloc.dart' ;
8+ import 'package:timefly/blocs/theme/theme_event.dart' ;
79import 'package:timefly/blocs/theme/theme_state.dart' ;
810import 'package:timefly/models/user.dart' ;
911import 'package:timefly/utils/system_util.dart' ;
1012import 'package:timefly/widget/custom_edit_field.dart' ;
1113
1214import '../app_theme.dart' ;
15+ import 'change_theme_screen.dart' ;
1316
1417class 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