diff --git a/app/lib/main.dart b/app/lib/main.dart index a886f37..1318877 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -27,47 +27,53 @@ Future main() async { runApp(MyApp()); } -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')); - }); - }); - }); - } - +class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { 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'), - ); - }); + providers: [ + ChangeNotifierProvider(create: (context) => SettingsProvider()), + ], + builder: (context, child) { + var isDarkMode = context.watch().isDarkMode; + return AnimatedCrossFade( + crossFadeState: isDarkMode != null ? CrossFadeState.showFirst : CrossFadeState.showSecond, + alignment: Alignment.center, + layoutBuilder: (topChild, topChildKey, bottomChild, bottomChildKey) => Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + Positioned(key: bottomChildKey, child: bottomChild), + Positioned(key: topChildKey, child: topChild), + ], + ), + firstChild: MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: isDarkMode == true ? Colors.blue : Colors.blue, + brightness: isDarkMode == true ? Brightness.dark : Brightness.light, + ), + home: MyHomePage(title: 'Flutter Demo Home Page'), + ), + secondChild: Builder(builder: (_) { + 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')); + }); + }); + return CircularProgressIndicator(); + }), + duration: Duration(seconds: 1), + ); + }, + ); } } diff --git a/app/lib/models/settings.dart b/app/lib/models/settings.dart index 60de8f8..12ee534 100644 --- a/app/lib/models/settings.dart +++ b/app/lib/models/settings.dart @@ -1,29 +1,18 @@ import 'package:flutter/foundation.dart'; class Settings { - Settings({ - this.isDarkMode, - }); + bool? _isDarkMode; - bool? isDarkMode; + bool? get isDarkMode => _isDarkMode; } -class SettingsProvider extends ChangeNotifier { - Settings _settings = Settings(); - - Settings get settings => _settings; - - set settings(Settings newSettings) { - _settings = newSettings; - notifyListeners(); - } - +class SettingsProvider extends Settings with ChangeNotifier { void setProps({ bool? isDarkMode, }) { bool changed = false; - if (isDarkMode != _settings.isDarkMode) { - _settings.isDarkMode = isDarkMode; + if (this._isDarkMode != isDarkMode) { + this._isDarkMode = isDarkMode; changed = true; } if (changed) notifyListeners();