From aa2454553c233bd0919636b086a212de8f5d4e34 Mon Sep 17 00:00:00 2001 From: debuggerx Date: Thu, 23 Sep 2021 15:43:47 +0800 Subject: [PATCH] wip: fix issues. --- app/README.md | 2 +- app/lib/constants/sp_keys.dart | 3 ++ app/lib/main.dart | 63 +++++++++++++++++++++++++++++++++++------- app/lib/models/configs.dart | 19 +++++++++++++ app/lib/models/settings.dart | 3 -- app/lib/utils/init_linux.dart | 26 +++++++++-------- 6 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 app/lib/constants/sp_keys.dart create mode 100644 app/lib/models/configs.dart diff --git a/app/README.md b/app/README.md index a6629fe..0649c9c 100644 --- a/app/README.md +++ b/app/README.md @@ -18,7 +18,7 @@ class Test { ``` -2. `app` 项目目录下执行 `flutter packages pub run build_runner build` +2. `app` 项目目录下执行 `flutter packages pub get && flutter packages pub run build_runner build --delete-conflicting-outputs` 3. 将在 `lib/models/test.provider.dart` 生成如下代码: ```dart diff --git a/app/lib/constants/sp_keys.dart b/app/lib/constants/sp_keys.dart new file mode 100644 index 0000000..d3b1d79 --- /dev/null +++ b/app/lib/constants/sp_keys.dart @@ -0,0 +1,3 @@ +class SPKeys { + static final String brightnessMode = 'BRIGHTNESS_MODE'; +} \ No newline at end of file diff --git a/app/lib/main.dart b/app/lib/main.dart index 8382e84..6dc37f6 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,3 +1,5 @@ +import 'package:dde_gesture_manager/models/configs.dart'; +import 'package:dde_gesture_manager/models/configs.provider.dart'; import 'package:dde_gesture_manager/models/settings.provider.dart'; import 'package:dde_gesture_manager/utils/init.dart'; import 'package:flutter/foundation.dart'; @@ -17,17 +19,25 @@ class MyApp extends StatelessWidget { return MultiProvider( providers: [ ChangeNotifierProvider(create: (context) => SettingsProvider()), + ChangeNotifierProvider(create: (context) => ConfigsProvider()), ], builder: (context, child) { var isDarkMode = context.watch().isDarkMode; + var brightnessMode = context.watch().brightnessMode; + late bool showDarkMode; + if (brightnessMode == BrightnessMode.system) { + showDarkMode = isDarkMode ?? false; + } else { + showDarkMode = brightnessMode == BrightnessMode.dark; + } return MaterialApp( title: 'Flutter Demo', theme: ThemeData( - primarySwatch: isDarkMode == true ? Colors.blue : Colors.blue, - brightness: isDarkMode == true ? Brightness.dark : Brightness.light, + primarySwatch: showDarkMode ? Colors.blue : Colors.blue, + brightness: showDarkMode ? Brightness.dark : Brightness.light, ), home: AnimatedCrossFade( - crossFadeState: isDarkMode != null ? CrossFadeState.showFirst : CrossFadeState.showSecond, + crossFadeState: isDarkMode != null ? CrossFadeState.showSecond : CrossFadeState.showFirst, alignment: Alignment.center, layoutBuilder: (topChild, topChildKey, bottomChild, bottomChildKey) => Stack( clipBehavior: Clip.none, @@ -37,14 +47,12 @@ class MyApp extends StatelessWidget { Positioned(key: topChildKey, child: topChild), ], ), - firstChild: MyHomePage(title: 'Flutter Demo Home Page'), - secondChild: Builder(builder: (context) { - initEvents(context); - return Center( - child: CircularProgressIndicator(), - ); + firstChild: Builder(builder: (context) { + Future.microtask(() => initEvents(context)); + return Container(); }), - duration: Duration(seconds: 1), + secondChild: MyHomePage(title: 'Flutter Demo Home Page'), + duration: Duration(milliseconds: 500), ), ); }, @@ -72,6 +80,7 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { + var brightnessMode = context.watch().brightnessMode; return Scaffold( appBar: AppBar( title: Text(widget.title), @@ -87,6 +96,40 @@ class _MyHomePageState extends State { '$_counter', style: Theme.of(context).textTheme.headline4, ), + ListTile( + title: const Text('System'), + leading: Radio( + value: BrightnessMode.system, + groupValue: brightnessMode, + onChanged: (BrightnessMode? value) { + context.read().setProps(brightnessMode: value); + }, + ), + ), + ListTile( + title: const Text('Light'), + leading: Radio( + value: BrightnessMode.light, + groupValue: brightnessMode, + onChanged: (BrightnessMode? value) { + setState(() { + context.read().setProps(brightnessMode: value); + }); + }, + ), + ), + ListTile( + title: const Text('Dark'), + leading: Radio( + value: BrightnessMode.dark, + groupValue: brightnessMode, + onChanged: (BrightnessMode? value) { + setState(() { + context.read().setProps(brightnessMode: value); + }); + }, + ), + ), ], ), ), diff --git a/app/lib/models/configs.dart b/app/lib/models/configs.dart new file mode 100644 index 0000000..f8822b1 --- /dev/null +++ b/app/lib/models/configs.dart @@ -0,0 +1,19 @@ +import 'package:dde_gesture_manager/builder/provider_annotation.dart'; +import 'package:dde_gesture_manager/constants/sp_keys.dart'; +import 'package:dde_gesture_manager/utils/helper.dart'; + +enum BrightnessMode { + system, + light, + dark, +} + +@ProviderModel() +class Configs { + @ProviderModelProp() + BrightnessMode? brightnessMode; + + Configs() { + this.brightnessMode = BrightnessMode.values[H().sp.getInt(SPKeys.brightnessMode)?.clamp(0, 2) ?? 0]; + } +} diff --git a/app/lib/models/settings.dart b/app/lib/models/settings.dart index 06b4c8f..27a264d 100644 --- a/app/lib/models/settings.dart +++ b/app/lib/models/settings.dart @@ -4,7 +4,4 @@ import 'package:dde_gesture_manager/builder/provider_annotation.dart'; class Settings { @ProviderModelProp() bool? isDarkMode; - - @ProviderModelProp() - String? name; } diff --git a/app/lib/utils/init_linux.dart b/app/lib/utils/init_linux.dart index 4291835..02e7fed 100644 --- a/app/lib/utils/init_linux.dart +++ b/app/lib/utils/init_linux.dart @@ -1,5 +1,4 @@ import 'package:dde_gesture_manager/utils/helper.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gsettings/gsettings.dart'; import 'package:provider/provider.dart'; @@ -12,17 +11,22 @@ Future initEvents(BuildContext context) async { context.read().setProps(isDarkMode: isDark); } else { var xsettings = GSettings('com.deepin.xsettings'); - xsettings.get('theme-name').then((value) { - Future.delayed( - Duration(seconds: 1), - () => context.read().setProps(isDarkMode: value.toString().contains('dark')), - ); - }); - xsettings.keysChanged.listen((event) { - xsettings.get('theme-name').then((value) { - context.read().setProps(isDarkMode: value.toString().contains('dark')); + String? themeName; + try { + themeName = (await xsettings.get('theme-name')).toString(); + } catch (e) { + print(e); + context.read().setProps(isDarkMode: false); + } + + if (themeName != null) { + context.read().setProps(isDarkMode: themeName.contains('dark')); + xsettings.keysChanged.listen((event) { + xsettings.get('theme-name').then((value) { + context.read().setProps(isDarkMode: value.toString().contains('dark')); + }); }); - }); + } } }