feat: Add dark mode and theming options to app settings page

This commit is contained in:
Dr-Blank 2024-05-11 04:46:17 -04:00
parent 3ecdaadc3f
commit 1609fe9d65
No known key found for this signature in database
GPG key ID: 7452CC63F210A266
4 changed files with 42 additions and 10 deletions

View file

@ -32,6 +32,7 @@ class AppSettingsPage extends HookConsumerWidget {
SettingsTile.switchTile( SettingsTile.switchTile(
initialValue: appSettings.isDarkMode, initialValue: appSettings.isDarkMode,
title: const Text('Dark Mode'), title: const Text('Dark Mode'),
description: const Text('we all know dark mode is better'),
leading: appSettings.isDarkMode leading: appSettings.isDarkMode
? const Icon(Icons.dark_mode) ? const Icon(Icons.dark_mode)
: const Icon(Icons.light_mode), : const Icon(Icons.light_mode),
@ -42,6 +43,9 @@ class AppSettingsPage extends HookConsumerWidget {
SettingsTile.switchTile( SettingsTile.switchTile(
initialValue: appSettings.useMaterialThemeOnItemPage, initialValue: appSettings.useMaterialThemeOnItemPage,
title: const Text('Use Material Theming on Item Page'), title: const Text('Use Material Theming on Item Page'),
description: const Text(
'get fancy with the colors on the item page at the cost of some performance',
),
leading: const Icon(Icons.dynamic_form_outlined), leading: const Icon(Icons.dynamic_form_outlined),
onToggle: (value) { onToggle: (value) {
ref.read(appSettingsProvider.notifier).updateState( ref.read(appSettingsProvider.notifier).updateState(

View file

@ -22,7 +22,8 @@ class ScaffoldWithNavBar extends StatelessWidget {
landscapeLayout: BottomNavigationBarLandscapeLayout.centered, landscapeLayout: BottomNavigationBarLandscapeLayout.centered,
selectedFontSize: Theme.of(context).textTheme.labelMedium!.fontSize!, selectedFontSize: Theme.of(context).textTheme.labelMedium!.fontSize!,
unselectedFontSize: Theme.of(context).textTheme.labelMedium!.fontSize!, unselectedFontSize: Theme.of(context).textTheme.labelMedium!.fontSize!,
// fixedColor: Theme.of(context).colorScheme.primary, showUnselectedLabels: false,
fixedColor: Theme.of(context).colorScheme.onBackground,
// type: BottomNavigationBarType.fixed, // type: BottomNavigationBarType.fixed,
// Here, the items of BottomNavigationBar are hard coded. In a real // Here, the items of BottomNavigationBar are hard coded. In a real

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:shelfsdk/audiobookshelf_api.dart';
import 'package:whispering_pages/api/image_provider.dart'; import 'package:whispering_pages/api/image_provider.dart';
@ -6,15 +7,38 @@ import 'package:whispering_pages/api/image_provider.dart';
part 'theme_from_cover_provider.g.dart'; part 'theme_from_cover_provider.g.dart';
@riverpod @riverpod
FutureOr<ColorScheme> themeFromCover( Future<FutureOr<ColorScheme?>> themeFromCover(
ThemeFromCoverRef ref, ThemeFromCoverRef ref,
ImageProvider<Object> img, { ImageProvider<Object> img, {
Brightness brightness = Brightness.dark, Brightness brightness = Brightness.dark,
}) { }) async {
// add deliberate delay to simulate a long running task
await Future.delayed(200.ms);
return ColorScheme.fromImageProvider( return ColorScheme.fromImageProvider(
provider: img, provider: img,
brightness: brightness, brightness: brightness,
); );
// TODO isolate is not working
// see https://github.com/flutter/flutter/issues/119207
// use isolate to generate the color scheme
// RootIsolateToken? token = RootIsolateToken.instance;
// final scheme = await Isolate.run(
// () async {
// debugPrint('Isolate running ${Isolate.current.debugName}');
// try {
// BackgroundIsolateBinaryMessenger.ensureInitialized(token!);
// WidgetsFlutterBinding.ensureInitialized();
// return await ColorScheme.fromImageProvider(
// provider: img,
// brightness: brightness,
// );
// } catch (e) {
// debugPrint('Error in isolate: $e');
// return null;
// }
// },
// );
// return scheme;
} }
@riverpod @riverpod

View file

@ -6,7 +6,7 @@ part of 'theme_from_cover_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$themeFromCoverHash() => r'e52e7b9c644f3fcc266cfc480b7003ec7492431c'; String _$themeFromCoverHash() => r'b1d56a4add77d157a803424d02ef52c4d8c3f1d7';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {
@ -34,7 +34,7 @@ class _SystemHash {
const themeFromCoverProvider = ThemeFromCoverFamily(); const themeFromCoverProvider = ThemeFromCoverFamily();
/// See also [themeFromCover]. /// See also [themeFromCover].
class ThemeFromCoverFamily extends Family<AsyncValue<ColorScheme>> { class ThemeFromCoverFamily extends Family<AsyncValue<FutureOr<ColorScheme?>>> {
/// See also [themeFromCover]. /// See also [themeFromCover].
const ThemeFromCoverFamily(); const ThemeFromCoverFamily();
@ -75,7 +75,8 @@ class ThemeFromCoverFamily extends Family<AsyncValue<ColorScheme>> {
} }
/// See also [themeFromCover]. /// See also [themeFromCover].
class ThemeFromCoverProvider extends AutoDisposeFutureProvider<ColorScheme> { class ThemeFromCoverProvider
extends AutoDisposeFutureProvider<FutureOr<ColorScheme?>> {
/// See also [themeFromCover]. /// See also [themeFromCover].
ThemeFromCoverProvider( ThemeFromCoverProvider(
ImageProvider<Object> img, { ImageProvider<Object> img, {
@ -115,7 +116,8 @@ class ThemeFromCoverProvider extends AutoDisposeFutureProvider<ColorScheme> {
@override @override
Override overrideWith( Override overrideWith(
FutureOr<ColorScheme> Function(ThemeFromCoverRef provider) create, FutureOr<FutureOr<ColorScheme?>> Function(ThemeFromCoverRef provider)
create,
) { ) {
return ProviderOverride( return ProviderOverride(
origin: this, origin: this,
@ -133,7 +135,7 @@ class ThemeFromCoverProvider extends AutoDisposeFutureProvider<ColorScheme> {
} }
@override @override
AutoDisposeFutureProviderElement<ColorScheme> createElement() { AutoDisposeFutureProviderElement<FutureOr<ColorScheme?>> createElement() {
return _ThemeFromCoverProviderElement(this); return _ThemeFromCoverProviderElement(this);
} }
@ -154,7 +156,8 @@ class ThemeFromCoverProvider extends AutoDisposeFutureProvider<ColorScheme> {
} }
} }
mixin ThemeFromCoverRef on AutoDisposeFutureProviderRef<ColorScheme> { mixin ThemeFromCoverRef
on AutoDisposeFutureProviderRef<FutureOr<ColorScheme?>> {
/// The parameter `img` of this provider. /// The parameter `img` of this provider.
ImageProvider<Object> get img; ImageProvider<Object> get img;
@ -163,7 +166,7 @@ mixin ThemeFromCoverRef on AutoDisposeFutureProviderRef<ColorScheme> {
} }
class _ThemeFromCoverProviderElement class _ThemeFromCoverProviderElement
extends AutoDisposeFutureProviderElement<ColorScheme> extends AutoDisposeFutureProviderElement<FutureOr<ColorScheme?>>
with ThemeFromCoverRef { with ThemeFromCoverRef {
_ThemeFromCoverProviderElement(super.provider); _ThemeFromCoverProviderElement(super.provider);