Skip to content

Commit

Permalink
Merge pull request #605 from ErBWs/feat-dynamic-color
Browse files Browse the repository at this point in the history
add dynamic color support
  • Loading branch information
Predidit authored Jan 14, 2025
2 parents 1e9c6b5 + 5c0504b commit 1b3dda3
Show file tree
Hide file tree
Showing 13 changed files with 208 additions and 171 deletions.
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

0 comments on commit 1b3dda3

Please sign in to comment.