follow system theme at startup and changing

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2022-09-06 22:34:01 +08:00
parent a3c1e5ddb4
commit 17a7cbf7bb
5 changed files with 60 additions and 19 deletions

View File

@ -25,6 +25,6 @@ void main(List<String> args) async {
.add(Client(3, false, false, "UserD", "441123123", true, false, false)); .add(Client(3, false, false, "UserD", "441123123", true, false, false));
runApp(GetMaterialApp( runApp(GetMaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: getCurrentTheme(), theme: MyTheme.initialTheme(),
home: DesktopServerPage())); home: DesktopServerPage()));
} }

View File

@ -192,6 +192,28 @@ class MyTheme {
], ],
); );
static changeTo(bool dark) {
Get.find<SharedPreferences>().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<SharedPreferences>().setString("darkTheme", dark ? "Y" : "");
}
_themeInitialed = true;
return dark ? MyTheme.darkTheme : MyTheme.lightTheme;
}
static ColorThemeExtension color(BuildContext context) { static ColorThemeExtension color(BuildContext context) {
return Theme.of(context).extension<ColorThemeExtension>()!; return Theme.of(context).extension<ColorThemeExtension>()!;
} }
@ -201,6 +223,14 @@ class MyTheme {
} }
} }
class ThemeModeNotifier {
final ValueNotifier<Brightness> brightness;
ThemeModeNotifier(this.brightness);
changeThemeBrightness({required Brightness brightness}) {
this.brightness.value = brightness;
}
}
bool isDarkTheme() { bool isDarkTheme() {
final isDark = "Y" == Get.find<SharedPreferences>().getString("darkTheme"); final isDark = "Y" == Get.find<SharedPreferences>().getString("darkTheme");
return isDark; return isDark;

View File

@ -224,21 +224,18 @@ class _UserInterfaceState extends State<_UserInterface>
} }
Widget theme() { Widget theme() {
var change = () { change() {
bool dark = !isDarkTheme(); MyTheme.changeTo(!isDarkTheme());
Get.changeTheme(dark ? MyTheme.darkTheme : MyTheme.lightTheme); }
Get.find<SharedPreferences>().setString("darkTheme", dark ? "Y" : "");
Get.forceAppUpdate();
};
return GestureDetector( return GestureDetector(
onTap: change,
child: Row( child: Row(
children: [ children: [
Checkbox(value: isDarkTheme(), onChanged: (_) => change()), Checkbox(value: isDarkTheme(), onChanged: (_) => change()),
Expanded(child: Text(translate('Dark Theme'))), Expanded(child: Text(translate('Dark Theme'))),
], ],
).marginOnly(left: _kCheckBoxLeftMargin), ).marginOnly(left: _kCheckBoxLeftMargin),
onTap: change,
); );
} }
} }

View File

@ -33,7 +33,6 @@ class _DesktopTabPageState extends State<DesktopTabPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final dark = isDarkTheme();
RxBool fullscreen = false.obs; RxBool fullscreen = false.obs;
Get.put(fullscreen, tag: 'fullscreen'); Get.put(fullscreen, tag: 'fullscreen');
return Obx(() => DragToResizeArea( return Obx(() => DragToResizeArea(

View File

@ -71,10 +71,6 @@ Future<Null> main(List<String> args) async {
} }
} }
ThemeData getCurrentTheme() {
return isDarkTheme() ? MyTheme.darkTheme : MyTheme.lightTheme;
}
Future<void> initEnv(String appType) async { Future<void> initEnv(String appType) async {
await platformFFI.init(appType); await platformFFI.init(appType);
// global FFI, use this **ONLY** for global configuration // global FFI, use this **ONLY** for global configuration
@ -117,7 +113,7 @@ void runRemoteScreen(Map<String, dynamic> argument) async {
navigatorKey: globalKey, navigatorKey: globalKey,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'RustDesk - Remote Desktop', title: 'RustDesk - Remote Desktop',
theme: getCurrentTheme(), theme: MyTheme.initialTheme(),
home: DesktopRemoteScreen( home: DesktopRemoteScreen(
params: argument, params: argument,
), ),
@ -135,7 +131,7 @@ void runFileTransferScreen(Map<String, dynamic> argument) async {
navigatorKey: globalKey, navigatorKey: globalKey,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'RustDesk - File Transfer', title: 'RustDesk - File Transfer',
theme: getCurrentTheme(), theme: MyTheme.initialTheme(),
home: DesktopFileTransferScreen(params: argument), home: DesktopFileTransferScreen(params: argument),
navigatorObservers: [ navigatorObservers: [
// FirebaseAnalyticsObserver(analytics: analytics), // FirebaseAnalyticsObserver(analytics: analytics),
@ -152,7 +148,7 @@ void runPortForwardScreen(Map<String, dynamic> argument) async {
navigatorKey: globalKey, navigatorKey: globalKey,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'RustDesk - Port Forward', title: 'RustDesk - Port Forward',
theme: getCurrentTheme(), theme: MyTheme.initialTheme(),
home: DesktopPortForwardScreen(params: argument), home: DesktopPortForwardScreen(params: argument),
navigatorObservers: [ navigatorObservers: [
// FirebaseAnalyticsObserver(analytics: analytics), // FirebaseAnalyticsObserver(analytics: analytics),
@ -176,7 +172,7 @@ void runConnectionManagerScreen() async {
]); ]);
runApp(GetMaterialApp( runApp(GetMaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: getCurrentTheme(), theme: MyTheme.initialTheme(),
home: DesktopServerPage(), home: DesktopServerPage(),
builder: _keepScaleBuilder())); builder: _keepScaleBuilder()));
} }
@ -191,7 +187,26 @@ WindowOptions getHiddenTitleBarWindowOptions(Size size) {
); );
} }
class App extends StatelessWidget { class App extends StatefulWidget {
@override
State<App> createState() => _AppState();
}
class _AppState extends State<App> {
@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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// final analytics = FirebaseAnalytics.instance; // final analytics = FirebaseAnalytics.instance;
@ -210,7 +225,7 @@ class App extends StatelessWidget {
navigatorKey: globalKey, navigatorKey: globalKey,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'RustDesk', title: 'RustDesk',
theme: getCurrentTheme(), theme: MyTheme.initialTheme(mainPage: true),
home: isDesktop home: isDesktop
? const DesktopTabPage() ? const DesktopTabPage()
: !isAndroid : !isAndroid