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));
runApp(GetMaterialApp(
debugShowCheckedModeBanner: false,
theme: getCurrentTheme(),
theme: MyTheme.initialTheme(),
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) {
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() {
final isDark = "Y" == Get.find<SharedPreferences>().getString("darkTheme");
return isDark;

View File

@ -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<SharedPreferences>().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,
);
}
}

View File

@ -33,7 +33,6 @@ class _DesktopTabPageState extends State<DesktopTabPage> {
@override
Widget build(BuildContext context) {
final dark = isDarkTheme();
RxBool fullscreen = false.obs;
Get.put(fullscreen, tag: 'fullscreen');
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 {
await platformFFI.init(appType);
// global FFI, use this **ONLY** for global configuration
@ -117,7 +113,7 @@ void runRemoteScreen(Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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<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
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