Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add dynamic color support #605

Merged
merged 4 commits into from
Jan 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 49 additions & 20 deletions lib/app_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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/bean/settings/theme_provider.dart';
import 'package:provider/provider.dart';

class AppWidget extends StatefulWidget {
const AppWidget({super.key});
Expand Down Expand Up @@ -132,6 +134,7 @@ class _AppWidgetState extends State<AppWidget>

@override
Widget build(BuildContext context) {
final ThemeProvider themeProvider = Provider.of<ThemeProvider>(context);
if (Utils.isDesktop()) {
_handleTray();
}
Expand All @@ -145,31 +148,57 @@ class _AppWidgetState extends State<AppWidget>
}
bool oledEnhance =
setting.get(SettingBoxKey.oledEnhance, defaultValue: false);
final defaultThemeMode =
setting.get(SettingBoxKey.themeMode, defaultValue: 'system');
if (defaultThemeMode == 'dark') {
themeProvider.setThemeMode(ThemeMode.dark, notify: false);
}
if (defaultThemeMode == 'light') {
themeProvider.setThemeMode(ThemeMode.light, notify: false);
}
if (defaultThemeMode == 'system') {
themeProvider.setThemeMode(ThemeMode.system, notify: false);
}
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,
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),
notify: false,
);
}
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]);

Expand Down
24 changes: 24 additions & 0 deletions lib/bean/settings/theme_provider.dart
Original file line number Diff line number Diff line change
@@ -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, {bool notify = true}) {
this.light = light;
this.dark = dark;
if (notify) notifyListeners();
}

void setThemeMode(ThemeMode mode, {bool notify = true}) {
themeMode = mode;
if (notify) notifyListeners();
}

void setDynamic(bool useDynamicColor, {bool notify = true}) {
this.useDynamicColor = useDynamicColor;
if (notify) notifyListeners();
}
}
15 changes: 11 additions & 4 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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/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';
Expand All @@ -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();
Expand Down Expand Up @@ -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(),
),
),
);
}
12 changes: 7 additions & 5 deletions lib/pages/init_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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/bean/settings/theme_provider.dart';

class InitPage extends StatefulWidget {
const InitPage({super.key});
Expand All @@ -25,6 +25,7 @@ class _InitPageState extends State<InitPage> {
final PluginsController pluginsController = Modular.get<PluginsController>();
final CollectController collectController = Modular.get<CollectController>();
Box setting = GStorage.setting;
late final ThemeProvider themeProvider;

// Future<File> _getLogFile() async {
// final directory = await getApplicationDocumentsDirectory();
Expand All @@ -42,6 +43,7 @@ class _InitPageState extends State<InitPage> {
_webDavInit();
_update();
_migrateStorage();
themeProvider = Provider.of<ThemeProvider>(context, listen: false);
super.initState();
}

Expand Down Expand Up @@ -125,6 +127,8 @@ class _InitPageState extends State<InitPage> {
},
);
} else {
themeProvider.setDynamic(
setting.get(SettingBoxKey.useDynamicColor, defaultValue: false));
Modular.to.navigate('/tab/popular/');
}
}
Expand Down Expand Up @@ -173,8 +177,6 @@ class LoadingWidget extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Scaffold(
body: Container()
);
return Scaffold(body: Container());
}
}
Loading
Loading