diff --git a/flutter/lib/cm_main.dart b/flutter/lib/cm_main.dart index bf72849e8..a92edd194 100644 --- a/flutter/lib/cm_main.dart +++ b/flutter/lib/cm_main.dart @@ -25,6 +25,6 @@ void main(List args) async { .add(Client(3, false, false, "UserD", "441123123", true, false, false)); runApp(GetMaterialApp( debugShowCheckedModeBanner: false, - theme: getCurrentTheme(), + theme: MyTheme.initialTheme(), home: DesktopServerPage())); } diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index da644c357..bd16fa4c5 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -192,6 +192,28 @@ class MyTheme { ], ); + static changeTo(bool dark) { + Get.find().setString("darkTheme", dark ? "Y" : ""); + Get.changeTheme(dark ? MyTheme.darkTheme : MyTheme.lightTheme); + Get.forceAppUpdate(); + } + + static bool _themeInitialed = false; + + static ThemeData initialTheme({bool mainPage = false}) { + bool dark; + // Brightnesss is always light on windows, Flutter 3.0.5 + if (_themeInitialed || !mainPage || Platform.isWindows) { + dark = isDarkTheme(); + } else { + dark = WidgetsBinding.instance.platformDispatcher.platformBrightness == + Brightness.dark; + Get.find().setString("darkTheme", dark ? "Y" : ""); + } + _themeInitialed = true; + return dark ? MyTheme.darkTheme : MyTheme.lightTheme; + } + static ColorThemeExtension color(BuildContext context) { return Theme.of(context).extension()!; } @@ -201,6 +223,14 @@ class MyTheme { } } +class ThemeModeNotifier { + final ValueNotifier brightness; + ThemeModeNotifier(this.brightness); + changeThemeBrightness({required Brightness brightness}) { + this.brightness.value = brightness; + } +} + bool isDarkTheme() { final isDark = "Y" == Get.find().getString("darkTheme"); return isDark; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 48fc0a5e7..a6ae89d71 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -224,21 +224,18 @@ class _UserInterfaceState extends State<_UserInterface> } Widget theme() { - var change = () { - bool dark = !isDarkTheme(); - Get.changeTheme(dark ? MyTheme.darkTheme : MyTheme.lightTheme); - Get.find().setString("darkTheme", dark ? "Y" : ""); - Get.forceAppUpdate(); - }; + change() { + MyTheme.changeTo(!isDarkTheme()); + } return GestureDetector( + onTap: change, child: Row( children: [ Checkbox(value: isDarkTheme(), onChanged: (_) => change()), Expanded(child: Text(translate('Dark Theme'))), ], ).marginOnly(left: _kCheckBoxLeftMargin), - onTap: change, ); } } diff --git a/flutter/lib/desktop/pages/desktop_tab_page.dart b/flutter/lib/desktop/pages/desktop_tab_page.dart index 87082284b..fde543a89 100644 --- a/flutter/lib/desktop/pages/desktop_tab_page.dart +++ b/flutter/lib/desktop/pages/desktop_tab_page.dart @@ -33,7 +33,6 @@ class _DesktopTabPageState extends State { @override Widget build(BuildContext context) { - final dark = isDarkTheme(); RxBool fullscreen = false.obs; Get.put(fullscreen, tag: 'fullscreen'); return Obx(() => DragToResizeArea( diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index 5ec2da9f8..a25ed7027 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -71,10 +71,6 @@ Future main(List args) async { } } -ThemeData getCurrentTheme() { - return isDarkTheme() ? MyTheme.darkTheme : MyTheme.lightTheme; -} - Future initEnv(String appType) async { await platformFFI.init(appType); // global FFI, use this **ONLY** for global configuration @@ -117,7 +113,7 @@ void runRemoteScreen(Map argument) async { navigatorKey: globalKey, debugShowCheckedModeBanner: false, title: 'RustDesk - Remote Desktop', - theme: getCurrentTheme(), + theme: MyTheme.initialTheme(), home: DesktopRemoteScreen( params: argument, ), @@ -135,7 +131,7 @@ void runFileTransferScreen(Map argument) async { navigatorKey: globalKey, debugShowCheckedModeBanner: false, title: 'RustDesk - File Transfer', - theme: getCurrentTheme(), + theme: MyTheme.initialTheme(), home: DesktopFileTransferScreen(params: argument), navigatorObservers: [ // FirebaseAnalyticsObserver(analytics: analytics), @@ -152,7 +148,7 @@ void runPortForwardScreen(Map argument) async { navigatorKey: globalKey, debugShowCheckedModeBanner: false, title: 'RustDesk - Port Forward', - theme: getCurrentTheme(), + theme: MyTheme.initialTheme(), home: DesktopPortForwardScreen(params: argument), navigatorObservers: [ // FirebaseAnalyticsObserver(analytics: analytics), @@ -176,7 +172,7 @@ void runConnectionManagerScreen() async { ]); runApp(GetMaterialApp( debugShowCheckedModeBanner: false, - theme: getCurrentTheme(), + theme: MyTheme.initialTheme(), home: DesktopServerPage(), builder: _keepScaleBuilder())); } @@ -191,7 +187,26 @@ WindowOptions getHiddenTitleBarWindowOptions(Size size) { ); } -class App extends StatelessWidget { +class App extends StatefulWidget { + @override + State createState() => _AppState(); +} + +class _AppState extends State { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.window.onPlatformBrightnessChanged = () { + WidgetsBinding.instance.handlePlatformBrightnessChanged(); + var system = + WidgetsBinding.instance.platformDispatcher.platformBrightness; + var current = isDarkTheme() ? Brightness.dark : Brightness.light; + if (current != system) { + MyTheme.changeTo(system == Brightness.dark); + } + }; + } + @override Widget build(BuildContext context) { // final analytics = FirebaseAnalytics.instance; @@ -210,7 +225,7 @@ class App extends StatelessWidget { navigatorKey: globalKey, debugShowCheckedModeBanner: false, title: 'RustDesk', - theme: getCurrentTheme(), + theme: MyTheme.initialTheme(mainPage: true), home: isDesktop ? const DesktopTabPage() : !isAndroid