Infinite playing

💄 Optimized UX
This commit is contained in:
2025-12-20 13:29:04 +08:00
parent f5c8236363
commit b05566dd36
9 changed files with 229 additions and 31 deletions

View File

@@ -36,6 +36,7 @@ class SettingsState {
final bool watchForChanges;
final DefaultPlayerScreen defaultPlayerScreen;
final LyricsMode lyricsMode;
final bool continuePlays;
final Set<String> supportedFormats;
const SettingsState({
@@ -44,6 +45,7 @@ class SettingsState {
this.watchForChanges = true,
this.defaultPlayerScreen = DefaultPlayerScreen.cover,
this.lyricsMode = LyricsMode.auto,
this.continuePlays = false,
this.supportedFormats = const {
'.mp3',
'.flac',
@@ -62,6 +64,7 @@ class SettingsState {
bool? watchForChanges,
DefaultPlayerScreen? defaultPlayerScreen,
LyricsMode? lyricsMode,
bool? continuePlays,
Set<String>? supportedFormats,
}) {
return SettingsState(
@@ -70,6 +73,7 @@ class SettingsState {
watchForChanges: watchForChanges ?? this.watchForChanges,
defaultPlayerScreen: defaultPlayerScreen ?? this.defaultPlayerScreen,
lyricsMode: lyricsMode ?? this.lyricsMode,
continuePlays: continuePlays ?? this.continuePlays,
supportedFormats: supportedFormats ?? this.supportedFormats,
);
}
@@ -82,6 +86,7 @@ class SettingsNotifier extends _$SettingsNotifier {
static const String _watchForChangesKey = 'watch_for_changes';
static const String _defaultPlayerScreenKey = 'default_player_screen';
static const String _lyricsModeKey = 'lyrics_mode';
static const String _continuePlaysKey = 'continue_plays';
@override
Future<SettingsState> build() async {
@@ -101,12 +106,15 @@ class SettingsNotifier extends _$SettingsNotifier {
prefs.getInt(_lyricsModeKey) ?? 2; // Auto is default
final lyricsMode = LyricsMode.values[lyricsModeIndex];
final continuePlays = prefs.getBool(_continuePlaysKey) ?? false;
return SettingsState(
importMode: importMode,
autoScan: autoScan,
watchForChanges: watchForChanges,
defaultPlayerScreen: defaultPlayerScreen,
lyricsMode: lyricsMode,
continuePlays: continuePlays,
);
}
@@ -156,6 +164,15 @@ class SettingsNotifier extends _$SettingsNotifier {
state = AsyncValue.data(state.value!.copyWith(lyricsMode: mode));
}
}
Future<void> setContinuePlays(bool enabled) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_continuePlaysKey, enabled);
if (state.hasValue) {
state = AsyncValue.data(state.value!.copyWith(continuePlays: enabled));
}
}
}
// Convenience providers for specific settings
@@ -248,3 +265,21 @@ class LyricsModeNotifier extends _$LyricsModeNotifier {
await ref.read(settingsProvider.notifier).setLyricsMode(mode);
}
}
@riverpod
class ContinuePlaysNotifier extends _$ContinuePlaysNotifier {
@override
bool build() {
return ref
.watch(settingsProvider)
.when(
data: (settings) => settings.continuePlays,
loading: () => false,
error: (_, _) => false,
);
}
Future<void> update(bool enabled) async {
await ref.read(settingsProvider.notifier).setContinuePlays(enabled);
}
}

View File

@@ -33,7 +33,7 @@ final class SettingsNotifierProvider
SettingsNotifier create() => SettingsNotifier();
}
String _$settingsNotifierHash() => r'4099dd1aa3dfc971c0761f314d196f3bc97315e7';
String _$settingsNotifierHash() => r'7c3a92d9ac94e175b79a3a4485bd9bbcc1e860f9';
abstract class _$SettingsNotifier extends $AsyncNotifier<SettingsState> {
FutureOr<SettingsState> build();
@@ -324,3 +324,57 @@ abstract class _$LyricsModeNotifier extends $Notifier<LyricsMode> {
element.handleValue(ref, created);
}
}
@ProviderFor(ContinuePlaysNotifier)
const continuePlaysProvider = ContinuePlaysNotifierProvider._();
final class ContinuePlaysNotifierProvider
extends $NotifierProvider<ContinuePlaysNotifier, bool> {
const ContinuePlaysNotifierProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'continuePlaysProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$continuePlaysNotifierHash();
@$internal
@override
ContinuePlaysNotifier create() => ContinuePlaysNotifier();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(bool value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<bool>(value),
);
}
}
String _$continuePlaysNotifierHash() =>
r'17e5f9c933d67837301775ac5beda25462130775';
abstract class _$ContinuePlaysNotifier extends $Notifier<bool> {
bool build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref = this.ref as $Ref<bool, bool>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<bool, bool>,
bool,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}