From fe3c335bb1284ed4f9844bdc8b62985402b85c2d Mon Sep 17 00:00:00 2001 From: ErBW_s Date: Tue, 14 Jan 2025 21:13:37 +0800 Subject: [PATCH 1/4] add dynamic color support --- lib/app_widget.dart | 68 +++++--- lib/main.dart | 15 +- lib/modules/theme/theme_provider.dart | 24 +++ lib/pages/settings/theme_settings_page.dart | 168 +++++++++++--------- lib/utils/storage.dart | 3 +- pubspec.lock | 74 ++------- pubspec.yaml | 3 +- 7 files changed, 191 insertions(+), 164 deletions(-) create mode 100644 lib/modules/theme/theme_provider.dart diff --git a/lib/app_widget.dart b/lib/app_widget.dart index 064582ca..c7a06540 100644 --- a/lib/app_widget.dart +++ b/lib/app_widget.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; +import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:hive/hive.dart'; import 'package:kazumi/utils/utils.dart'; @@ -13,6 +13,8 @@ import 'package:kazumi/utils/logger.dart'; import 'package:window_manager/window_manager.dart'; import 'package:kazumi/utils/webdav.dart'; import 'package:kazumi/bean/dialog/dialog_helper.dart'; +import 'package:kazumi/modules/theme/theme_provider.dart'; +import 'package:provider/provider.dart'; class AppWidget extends StatefulWidget { const AppWidget({super.key}); @@ -132,6 +134,7 @@ class _AppWidgetState extends State @override Widget build(BuildContext context) { + final ThemeProvider themeProvider = Provider.of(context); if (Utils.isDesktop()) { _handleTray(); } @@ -145,31 +148,56 @@ class _AppWidgetState extends State } bool oledEnhance = setting.get(SettingBoxKey.oledEnhance, defaultValue: false); + themeProvider.setDynamic( + setting.get(SettingBoxKey.useDynamicColor, defaultValue: false)); + final defaultThemeMode = + setting.get(SettingBoxKey.themeMode, defaultValue: 'system'); + if (defaultThemeMode == 'dark') { + themeProvider.setThemeMode(ThemeMode.dark); + } + if (defaultThemeMode == 'light') { + themeProvider.setThemeMode(ThemeMode.light); + } + if (defaultThemeMode == 'system') { + themeProvider.setThemeMode(ThemeMode.system); + } var defaultDarkTheme = ThemeData( useMaterial3: true, brightness: Brightness.dark, colorSchemeSeed: color); var oledDarkTheme = Utils.oledDarkTheme(defaultDarkTheme); - var app = AdaptiveTheme( - light: ThemeData( - useMaterial3: true, - brightness: Brightness.light, - colorSchemeSeed: color), - dark: oledEnhance ? oledDarkTheme : defaultDarkTheme, - initial: AdaptiveThemeMode.system, - builder: (theme, darkTheme) => MaterialApp.router( - title: "Kazumi", - localizationsDelegates: GlobalMaterialLocalizations.delegates, - supportedLocales: const [ - Locale.fromSubtags( - languageCode: 'zh', scriptCode: 'Hans', countryCode: "CN") - ], - locale: const Locale.fromSubtags( - languageCode: 'zh', scriptCode: 'Hans', countryCode: "CN"), - theme: theme, - darkTheme: darkTheme, - routerConfig: Modular.routerConfig, + themeProvider.setTheme( + ThemeData( + useMaterial3: true, + brightness: Brightness.light, + colorSchemeSeed: color, ), + oledEnhance ? oledDarkTheme : defaultDarkTheme, + ); + var app = DynamicColorBuilder( + builder: (theme, darkTheme) { + if (themeProvider.useDynamicColor) { + themeProvider.setTheme( + ThemeData(colorScheme: theme), + oledEnhance + ? Utils.oledDarkTheme(ThemeData(colorScheme: darkTheme)) + : ThemeData(colorScheme: darkTheme)); + } + return MaterialApp.router( + title: "Kazumi", + localizationsDelegates: GlobalMaterialLocalizations.delegates, + supportedLocales: const [ + Locale.fromSubtags( + languageCode: 'zh', scriptCode: 'Hans', countryCode: "CN") + ], + locale: const Locale.fromSubtags( + languageCode: 'zh', scriptCode: 'Hans', countryCode: "CN"), + theme: themeProvider.light, + darkTheme: themeProvider.dark, + themeMode: themeProvider.themeMode, + routerConfig: Modular.routerConfig, + ); + }, ); Modular.setObservers([KazumiDialog.observer]); diff --git a/lib/main.dart b/lib/main.dart index d56266ec..ad799f35 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:kazumi/app_module.dart'; import 'package:kazumi/app_widget.dart'; import 'package:flutter_modular/flutter_modular.dart'; +import 'package:kazumi/modules/theme/theme_provider.dart'; import 'package:path_provider/path_provider.dart'; import 'package:kazumi/utils/storage.dart'; import 'package:hive_flutter/hive_flutter.dart'; @@ -12,6 +13,7 @@ import 'package:kazumi/utils/utils.dart'; import 'package:media_kit/media_kit.dart'; import 'package:window_manager/window_manager.dart'; import 'package:kazumi/pages/error/storage_error_page.dart'; +import 'package:provider/provider.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -54,8 +56,13 @@ void main() async { } Request(); await Request.setCookie(); - runApp(ModularApp( - module: AppModule(), - child: const AppWidget(), - )); + runApp( + ChangeNotifierProvider( + create: (_) => ThemeProvider(), + child: ModularApp( + module: AppModule(), + child: const AppWidget(), + ), + ), + ); } diff --git a/lib/modules/theme/theme_provider.dart b/lib/modules/theme/theme_provider.dart new file mode 100644 index 00000000..07259779 --- /dev/null +++ b/lib/modules/theme/theme_provider.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class ThemeProvider extends ChangeNotifier { + ThemeMode themeMode = ThemeMode.system; + bool useDynamicColor = false; + late ThemeData light; + late ThemeData dark; + + void setTheme(ThemeData light, ThemeData dark) { + this.light = light; + this.dark = dark; + notifyListeners(); + } + + void setThemeMode(ThemeMode mode) { + themeMode = mode; + notifyListeners(); + } + + void setDynamic(bool useDynamicColor) { + this.useDynamicColor = useDynamicColor; + notifyListeners(); + } +} diff --git a/lib/pages/settings/theme_settings_page.dart b/lib/pages/settings/theme_settings_page.dart index 2e2b5d1b..2bf3f58b 100644 --- a/lib/pages/settings/theme_settings_page.dart +++ b/lib/pages/settings/theme_settings_page.dart @@ -4,12 +4,13 @@ import 'package:flutter_modular/flutter_modular.dart'; import 'package:kazumi/utils/storage.dart'; import 'package:hive/hive.dart'; import 'package:kazumi/bean/dialog/dialog_helper.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; +import 'package:kazumi/modules/theme/theme_provider.dart'; import 'package:kazumi/pages/popular/popular_controller.dart'; import 'package:kazumi/bean/appbar/sys_app_bar.dart'; import 'package:kazumi/bean/settings/color_type.dart'; import 'package:kazumi/utils/utils.dart'; import 'package:card_settings_ui/card_settings_ui.dart'; +import 'package:provider/provider.dart'; class ThemeSettingsPage extends StatefulWidget { const ThemeSettingsPage({super.key}); @@ -24,7 +25,9 @@ class _ThemeSettingsPageState extends State { late dynamic defaultThemeMode; late dynamic defaultThemeColor; late bool oledEnhance; + late bool useDynamicColor; final PopularController popularController = Modular.get(); + late final ThemeProvider themeProvider; @override void initState() { @@ -34,6 +37,11 @@ class _ThemeSettingsPageState extends State { defaultThemeColor = setting.get(SettingBoxKey.themeColor, defaultValue: 'default'); oledEnhance = setting.get(SettingBoxKey.oledEnhance, defaultValue: false); + useDynamicColor = + setting.get(SettingBoxKey.useDynamicColor, defaultValue: false); + WidgetsBinding.instance.addPostFrameCallback((_) { + themeProvider = Provider.of(context, listen: false); + }); } void onBackPressed(BuildContext context) {} @@ -45,13 +53,13 @@ class _ThemeSettingsPageState extends State { colorSchemeSeed: color, ); var oledDarkTheme = Utils.oledDarkTheme(defaultDarkTheme); - AdaptiveTheme.of(context).setTheme( - light: ThemeData( + themeProvider.setTheme( + ThemeData( useMaterial3: true, brightness: Brightness.light, colorSchemeSeed: color, ), - dark: oledEnhance ? oledDarkTheme : defaultDarkTheme, + oledEnhance ? oledDarkTheme : defaultDarkTheme, ); defaultThemeColor = color?.value.toRadixString(16) ?? 'default'; setting.put(SettingBoxKey.themeColor, defaultThemeColor); @@ -64,13 +72,13 @@ class _ThemeSettingsPageState extends State { colorSchemeSeed: Colors.green, ); var oledDarkTheme = Utils.oledDarkTheme(defaultDarkTheme); - AdaptiveTheme.of(context).setTheme( - light: ThemeData( + themeProvider.setTheme( + ThemeData( useMaterial3: true, brightness: Brightness.light, colorSchemeSeed: Colors.green, ), - dark: oledEnhance ? oledDarkTheme : defaultDarkTheme, + oledEnhance ? oledDarkTheme : defaultDarkTheme, ); defaultThemeColor = 'default'; setting.put(SettingBoxKey.themeColor, 'default'); @@ -78,13 +86,13 @@ class _ThemeSettingsPageState extends State { void updateTheme(String theme) async { if (theme == 'dark') { - AdaptiveTheme.of(context).setDark(); + themeProvider.setThemeMode(ThemeMode.dark); } if (theme == 'light') { - AdaptiveTheme.of(context).setLight(); + themeProvider.setThemeMode(ThemeMode.light); } if (theme == 'system') { - AdaptiveTheme.of(context).setSystem(); + themeProvider.setThemeMode(ThemeMode.system); } await setting.put(SettingBoxKey.themeMode, theme); setState(() { @@ -122,6 +130,72 @@ class _ThemeSettingsPageState extends State { title: const Text('外观'), tiles: [ SettingsTile.navigation( + onPressed: (_) { + KazumiDialog.show(builder: (context) { + return AlertDialog( + title: const Text('深色模式'), + content: StatefulBuilder( + builder: + (BuildContext context, StateSetter setState) { + return Wrap( + spacing: 8, + runSpacing: Utils.isDesktop() ? 8 : 0, + children: [ + defaultThemeMode == 'system' + ? FilledButton( + onPressed: () { + updateTheme('system'); + KazumiDialog.dismiss(); + }, + child: const Text("跟随系统")) + : FilledButton.tonal( + onPressed: () { + updateTheme('system'); + KazumiDialog.dismiss(); + }, + child: const Text("跟随系统")), + defaultThemeMode == 'light' + ? FilledButton( + onPressed: () { + updateTheme('light'); + KazumiDialog.dismiss(); + }, + child: const Text("浅色")) + : FilledButton.tonal( + onPressed: () { + updateTheme('light'); + KazumiDialog.dismiss(); + }, + child: const Text("浅色")), + defaultThemeMode == 'dark' + ? FilledButton( + onPressed: () { + updateTheme('dark'); + KazumiDialog.dismiss(); + }, + child: const Text("深色")) + : FilledButton.tonal( + onPressed: () { + updateTheme('dark'); + KazumiDialog.dismiss(); + }, + child: const Text("深色")), + ], + ); + }, + ), + ); + }); + }, + title: const Text('深色模式'), + value: Text( + defaultThemeMode == 'light' + ? '浅色' + : (defaultThemeMode == 'dark' ? '深色' : '跟随系统'), + ), + ), + SettingsTile.navigation( + enabled: !useDynamicColor, onPressed: (_) async { KazumiDialog.show(builder: (context) { return AlertDialog( @@ -204,72 +278,20 @@ class _ThemeSettingsPageState extends State { }, title: const Text('配色方案'), ), - SettingsTile.navigation( - onPressed: (_) { - KazumiDialog.show(builder: (context) { - return AlertDialog( - title: const Text('深色模式'), - content: StatefulBuilder( - builder: - (BuildContext context, StateSetter setState) { - return Wrap( - spacing: 8, - runSpacing: Utils.isDesktop() ? 8 : 0, - children: [ - defaultThemeMode == 'system' - ? FilledButton( - onPressed: () { - updateTheme('system'); - KazumiDialog.dismiss(); - }, - child: const Text("跟随系统")) - : FilledButton.tonal( - onPressed: () { - updateTheme('system'); - KazumiDialog.dismiss(); - }, - child: const Text("跟随系统")), - defaultThemeMode == 'light' - ? FilledButton( - onPressed: () { - updateTheme('light'); - KazumiDialog.dismiss(); - }, - child: const Text("浅色")) - : FilledButton.tonal( - onPressed: () { - updateTheme('light'); - KazumiDialog.dismiss(); - }, - child: const Text("浅色")), - defaultThemeMode == 'dark' - ? FilledButton( - onPressed: () { - updateTheme('dark'); - KazumiDialog.dismiss(); - }, - child: const Text("深色")) - : FilledButton.tonal( - onPressed: () { - updateTheme('dark'); - KazumiDialog.dismiss(); - }, - child: const Text("深色")), - ], - ); - }, - ), - ); - }); + SettingsTile.switchTile( + enabled: !Platform.isIOS, + onToggle: (value) async { + useDynamicColor = value ?? !useDynamicColor; + await setting.put( + SettingBoxKey.useDynamicColor, useDynamicColor); + themeProvider.setDynamic(useDynamicColor); + setState(() {}); }, - title: const Text('深色模式'), - value: Text( - defaultThemeMode == 'light' - ? '浅色' - : (defaultThemeMode == 'dark' ? '深色' : '跟随系统'), - ), + title: const Text('动态配色'), + initialValue: useDynamicColor, ), ], + bottomInfo: const Text('动态配色仅支持安卓12及以上和桌面平台'), ), SettingsSection( tiles: [ diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 6733620b..ff7a8795 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -133,5 +133,6 @@ class SettingBoxKey { webDavURL = 'webDavURL', webDavUsername = 'webDavUsername', webDavPassword = 'webDavPasswd', - lowMemoryMode = 'lowMemoryMode'; + lowMemoryMode = 'lowMemoryMode', + useDynamicColor = 'useDynamicColor'; } diff --git a/pubspec.lock b/pubspec.lock index 5e150d9a..db766589 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,14 +14,6 @@ packages: description: dart source: sdk version: "0.3.3" - adaptive_theme: - dependency: "direct main" - description: - name: adaptive_theme - sha256: f4ee609b464e5efc68131d9d15ba9aa1de4e3b5ede64be17781c6e19a52d637d - url: "https://pub.dev" - source: hosted - version: "3.6.0" analyzer: dependency: transitive description: @@ -375,6 +367,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.0.8" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d + url: "https://pub.dev" + source: hosted + version: "1.7.0" expressions: dependency: transitive description: @@ -980,7 +980,7 @@ packages: source: hosted version: "1.5.1" provider: - dependency: transitive + dependency: "direct main" description: name: provider sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c @@ -1123,62 +1123,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.24.0" - shared_preferences: - dependency: transitive - description: - name: shared_preferences - sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82" - url: "https://pub.dev" - source: hosted - version: "2.3.3" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: "7f172d1b06de5da47b6264c2692ee2ead20bbbc246690427cdb4fc301cd0c549" - url: "https://pub.dev" - source: hosted - version: "2.3.4" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" - url: "https://pub.dev" - source: hosted - version: "2.5.3" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" shelf: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ed0e4636..3d67302d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,7 +57,8 @@ dependencies: flutter_volume_controller: ^1.3.2 audio_video_progress_bar: ^2.0.2 - adaptive_theme: ^3.6.0 + dynamic_color: ^1.7.0 + provider: ^6.1.2 flutter_displaymode: ^0.6.0 url_launcher: ^6.3.0 From 29fa181d50f8c3f98b3f508f03bef85e8fc7df91 Mon Sep 17 00:00:00 2001 From: ErBW_s Date: Tue, 14 Jan 2025 21:14:38 +0800 Subject: [PATCH 2/4] add dynamic color to platform file --- linux/flutter/generated_plugin_registrant.cc | 4 ++++ linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 4 ++-- windows/flutter/generated_plugin_registrant.cc | 3 +++ windows/flutter/generated_plugins.cmake | 1 + 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 6d2aaf79..43268c18 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include #include @@ -19,6 +20,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) desktop_webview_window_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopWebviewWindowPlugin"); desktop_webview_window_plugin_register_with_registrar(desktop_webview_window_registrar); + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); g_autoptr(FlPluginRegistrar) flutter_volume_controller_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterVolumeControllerPlugin"); flutter_volume_controller_plugin_register_with_registrar(flutter_volume_controller_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index e8be024e..74766b5b 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST desktop_webview_window + dynamic_color flutter_volume_controller media_kit_libs_linux media_kit_video diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9b2bbb85..4e4cf454 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import connectivity_plus import device_info_plus +import dynamic_color import flutter_volume_controller import media_kit_libs_macos_video import media_kit_video @@ -14,7 +15,6 @@ import package_info_plus import path_provider_foundation import screen_pixel import screen_retriever_macos -import shared_preferences_foundation import sqflite_darwin import tray_manager import url_launcher_macos @@ -25,6 +25,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) FlutterVolumeControllerPlugin.register(with: registry.registrar(forPlugin: "FlutterVolumeControllerPlugin")) MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) @@ -32,7 +33,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenPixelPlugin.register(with: registry.registrar(forPlugin: "ScreenPixelPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index c7d8564a..5c6b8385 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include #include @@ -20,6 +21,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); FlutterVolumeControllerPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterVolumeControllerPluginCApi")); MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index d8fc6138..26240d92 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST connectivity_plus + dynamic_color flutter_volume_controller media_kit_libs_windows_video media_kit_video From 4728058a8f8a5d5d81715f86d125876e00729dd5 Mon Sep 17 00:00:00 2001 From: ErBW_s Date: Wed, 15 Jan 2025 00:27:53 +0800 Subject: [PATCH 3/4] fix bad calling rebuild during build --- lib/app_widget.dart | 19 ++++++++++--------- lib/modules/theme/theme_provider.dart | 12 ++++++------ lib/pages/init_page.dart | 14 +++++++++----- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/lib/app_widget.dart b/lib/app_widget.dart index c7a06540..95dfc6e4 100644 --- a/lib/app_widget.dart +++ b/lib/app_widget.dart @@ -148,18 +148,16 @@ class _AppWidgetState extends State } bool oledEnhance = setting.get(SettingBoxKey.oledEnhance, defaultValue: false); - themeProvider.setDynamic( - setting.get(SettingBoxKey.useDynamicColor, defaultValue: false)); final defaultThemeMode = setting.get(SettingBoxKey.themeMode, defaultValue: 'system'); if (defaultThemeMode == 'dark') { - themeProvider.setThemeMode(ThemeMode.dark); + themeProvider.setThemeMode(ThemeMode.dark, notify: false); } if (defaultThemeMode == 'light') { - themeProvider.setThemeMode(ThemeMode.light); + themeProvider.setThemeMode(ThemeMode.light, notify: false); } if (defaultThemeMode == 'system') { - themeProvider.setThemeMode(ThemeMode.system); + themeProvider.setThemeMode(ThemeMode.system, notify: false); } var defaultDarkTheme = ThemeData( useMaterial3: true, @@ -173,15 +171,18 @@ class _AppWidgetState extends State colorSchemeSeed: color, ), oledEnhance ? oledDarkTheme : defaultDarkTheme, + notify: false, ); var app = DynamicColorBuilder( builder: (theme, darkTheme) { if (themeProvider.useDynamicColor) { themeProvider.setTheme( - ThemeData(colorScheme: theme), - oledEnhance - ? Utils.oledDarkTheme(ThemeData(colorScheme: darkTheme)) - : ThemeData(colorScheme: darkTheme)); + ThemeData(colorScheme: theme), + oledEnhance + ? Utils.oledDarkTheme(ThemeData(colorScheme: darkTheme)) + : ThemeData(colorScheme: darkTheme), + notify: false, + ); } return MaterialApp.router( title: "Kazumi", diff --git a/lib/modules/theme/theme_provider.dart b/lib/modules/theme/theme_provider.dart index 07259779..118128ef 100644 --- a/lib/modules/theme/theme_provider.dart +++ b/lib/modules/theme/theme_provider.dart @@ -6,19 +6,19 @@ class ThemeProvider extends ChangeNotifier { late ThemeData light; late ThemeData dark; - void setTheme(ThemeData light, ThemeData dark) { + void setTheme(ThemeData light, ThemeData dark, {bool notify = true}) { this.light = light; this.dark = dark; - notifyListeners(); + if (notify) notifyListeners(); } - void setThemeMode(ThemeMode mode) { + void setThemeMode(ThemeMode mode, {bool notify = true}) { themeMode = mode; - notifyListeners(); + if (notify) notifyListeners(); } - void setDynamic(bool useDynamicColor) { + void setDynamic(bool useDynamicColor, {bool notify = true}) { this.useDynamicColor = useDynamicColor; - notifyListeners(); + if (notify) notifyListeners(); } } diff --git a/lib/pages/init_page.dart b/lib/pages/init_page.dart index 7a5c5692..bcff1375 100644 --- a/lib/pages/init_page.dart +++ b/lib/pages/init_page.dart @@ -9,10 +9,10 @@ import 'package:kazumi/plugins/plugins_controller.dart'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:kazumi/pages/collect/collect_controller.dart'; import 'package:logger/logger.dart'; -// import 'package:fvp/mdk.dart' as mdk; import 'package:flutter/services.dart' show rootBundle; import 'package:kazumi/utils/logger.dart'; -// import 'package:path_provider/path_provider.dart'; +import 'package:provider/provider.dart'; +import 'package:kazumi/modules/theme/theme_provider.dart'; class InitPage extends StatefulWidget { const InitPage({super.key}); @@ -25,6 +25,7 @@ class _InitPageState extends State { final PluginsController pluginsController = Modular.get(); final CollectController collectController = Modular.get(); Box setting = GStorage.setting; + late final ThemeProvider themeProvider; // Future _getLogFile() async { // final directory = await getApplicationDocumentsDirectory(); @@ -42,6 +43,9 @@ class _InitPageState extends State { _webDavInit(); _update(); _migrateStorage(); + WidgetsBinding.instance.addPostFrameCallback((_) { + themeProvider = Provider.of(context, listen: false); + }); super.initState(); } @@ -125,6 +129,8 @@ class _InitPageState extends State { }, ); } else { + themeProvider.setDynamic( + setting.get(SettingBoxKey.useDynamicColor, defaultValue: false)); Modular.to.navigate('/tab/popular/'); } } @@ -173,8 +179,6 @@ class LoadingWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - body: Container() - ); + return Scaffold(body: Container()); } } From 5c0504bfe981a4d156ed061c1872be91961977f0 Mon Sep 17 00:00:00 2001 From: ErBW_s Date: Wed, 15 Jan 2025 01:18:39 +0800 Subject: [PATCH 4/4] remove PostFrameCallback in initState --- lib/app_widget.dart | 2 +- lib/{modules/theme => bean/settings}/theme_provider.dart | 0 lib/main.dart | 2 +- lib/pages/init_page.dart | 6 ++---- lib/pages/settings/theme_settings_page.dart | 6 ++---- 5 files changed, 6 insertions(+), 10 deletions(-) rename lib/{modules/theme => bean/settings}/theme_provider.dart (100%) diff --git a/lib/app_widget.dart b/lib/app_widget.dart index 95dfc6e4..92522a00 100644 --- a/lib/app_widget.dart +++ b/lib/app_widget.dart @@ -13,7 +13,7 @@ import 'package:kazumi/utils/logger.dart'; import 'package:window_manager/window_manager.dart'; import 'package:kazumi/utils/webdav.dart'; import 'package:kazumi/bean/dialog/dialog_helper.dart'; -import 'package:kazumi/modules/theme/theme_provider.dart'; +import 'package:kazumi/bean/settings/theme_provider.dart'; import 'package:provider/provider.dart'; class AppWidget extends StatefulWidget { diff --git a/lib/modules/theme/theme_provider.dart b/lib/bean/settings/theme_provider.dart similarity index 100% rename from lib/modules/theme/theme_provider.dart rename to lib/bean/settings/theme_provider.dart diff --git a/lib/main.dart b/lib/main.dart index ad799f35..2baad425 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:kazumi/app_module.dart'; import 'package:kazumi/app_widget.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:kazumi/modules/theme/theme_provider.dart'; +import 'package:kazumi/bean/settings/theme_provider.dart'; import 'package:path_provider/path_provider.dart'; import 'package:kazumi/utils/storage.dart'; import 'package:hive_flutter/hive_flutter.dart'; diff --git a/lib/pages/init_page.dart b/lib/pages/init_page.dart index bcff1375..8b8e972f 100644 --- a/lib/pages/init_page.dart +++ b/lib/pages/init_page.dart @@ -12,7 +12,7 @@ import 'package:logger/logger.dart'; import 'package:flutter/services.dart' show rootBundle; import 'package:kazumi/utils/logger.dart'; import 'package:provider/provider.dart'; -import 'package:kazumi/modules/theme/theme_provider.dart'; +import 'package:kazumi/bean/settings/theme_provider.dart'; class InitPage extends StatefulWidget { const InitPage({super.key}); @@ -43,9 +43,7 @@ class _InitPageState extends State { _webDavInit(); _update(); _migrateStorage(); - WidgetsBinding.instance.addPostFrameCallback((_) { - themeProvider = Provider.of(context, listen: false); - }); + themeProvider = Provider.of(context, listen: false); super.initState(); } diff --git a/lib/pages/settings/theme_settings_page.dart b/lib/pages/settings/theme_settings_page.dart index 2bf3f58b..fd521fb9 100644 --- a/lib/pages/settings/theme_settings_page.dart +++ b/lib/pages/settings/theme_settings_page.dart @@ -4,7 +4,7 @@ import 'package:flutter_modular/flutter_modular.dart'; import 'package:kazumi/utils/storage.dart'; import 'package:hive/hive.dart'; import 'package:kazumi/bean/dialog/dialog_helper.dart'; -import 'package:kazumi/modules/theme/theme_provider.dart'; +import 'package:kazumi/bean/settings/theme_provider.dart'; import 'package:kazumi/pages/popular/popular_controller.dart'; import 'package:kazumi/bean/appbar/sys_app_bar.dart'; import 'package:kazumi/bean/settings/color_type.dart'; @@ -39,9 +39,7 @@ class _ThemeSettingsPageState extends State { oledEnhance = setting.get(SettingBoxKey.oledEnhance, defaultValue: false); useDynamicColor = setting.get(SettingBoxKey.useDynamicColor, defaultValue: false); - WidgetsBinding.instance.addPostFrameCallback((_) { - themeProvider = Provider.of(context, listen: false); - }); + themeProvider = Provider.of(context, listen: false); } void onBackPressed(BuildContext context) {}