diff --git a/app/lib/main.dart b/app/lib/main.dart index 576db6d..a886f37 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,6 +1,9 @@ +import 'package:dde_gesture_manager/models/settings.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:gsettings/gsettings.dart'; +import 'package:provider/provider.dart'; import 'package:window_manager/window_manager.dart'; import 'package:xdg_directories/xdg_directories.dart' as xdgDir; @@ -20,32 +23,51 @@ Future main() async { var windowManager = WindowManager.instance; windowManager.setTitle('Gesture Manager For DDE'); windowManager.setMinimumSize(const Size(800, 600)); - var xsettings = GSettings('com.deepin.xsettings'); - // xsettings.get('scale-factor').then((value) { - // print(value.toString()); - // }); - xsettings.get('theme-name').then((value) { - print(value.toString()); - }); - xsettings.keysChanged.listen((event) { - xsettings.get('theme-name').then((value) { - print(value.toString()); - }); - }); } runApp(MyApp()); } -class MyApp extends StatelessWidget { +class MyApp extends StatefulWidget { + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + var xsettings = GSettings('com.deepin.xsettings'); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance?.addPostFrameCallback((_) { + xsettings.keysChanged.listen((event) { + xsettings.get('theme-name').then((value) { + context.read().setProps(isDarkMode: value.toString().contains('dark')); + }); + }); + }); + } + @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - home: MyHomePage(title: 'Flutter Demo Home Page'), - ); + return MultiProvider( + providers: [ + Provider(create: (context) => SettingsProvider()), + ], + builder: (context, child) { + var isDarkMode = context.watch().settings.isDarkMode; + return isDarkMode == null + ? Center( + child: CircularProgressIndicator(), + ) + : MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: isDarkMode ? Colors.blue : Colors.blue, + brightness: isDarkMode ? Brightness.dark : Brightness.light, + ), + home: MyHomePage(title: 'Flutter Demo Home Page'), + ); + }); } } diff --git a/app/lib/models/settings.dart b/app/lib/models/settings.dart new file mode 100644 index 0000000..60de8f8 --- /dev/null +++ b/app/lib/models/settings.dart @@ -0,0 +1,31 @@ +import 'package:flutter/foundation.dart'; + +class Settings { + Settings({ + this.isDarkMode, + }); + + bool? isDarkMode; +} + +class SettingsProvider extends ChangeNotifier { + Settings _settings = Settings(); + + Settings get settings => _settings; + + set settings(Settings newSettings) { + _settings = newSettings; + notifyListeners(); + } + + void setProps({ + bool? isDarkMode, + }) { + bool changed = false; + if (isDarkMode != _settings.isDarkMode) { + _settings.isDarkMode = isDarkMode; + changed = true; + } + if (changed) notifyListeners(); + } +} diff --git a/app/lib/utils/helper.dart b/app/lib/utils/helper.dart new file mode 100644 index 0000000..682c2c1 --- /dev/null +++ b/app/lib/utils/helper.dart @@ -0,0 +1,2 @@ +class H { +} \ No newline at end of file diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 9bb02d5..446340f 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -29,6 +29,7 @@ dependencies: shared_preferences: ^2.0.7 xdg_directories: 0.2.0 gsettings: 0.2.0 + provider: ^6.0.0 window_size: path: 3rd_party/window_size xdg_directories_web: