diff --git a/lib/components/Player/PlayerControls.dart b/lib/components/Player/PlayerControls.dart index 71033f93..15d99e21 100644 --- a/lib/components/Player/PlayerControls.dart +++ b/lib/components/Player/PlayerControls.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:just_audio/just_audio.dart'; import 'package:spotube/helpers/zero-pad-num-str.dart'; @@ -21,8 +20,6 @@ class PlayerControls extends HookConsumerWidget { final Playback playback = ref.watch(playbackProvider); final AudioPlayer player = playback.player; - final _shuffled = useState(false); - final onNext = useNextTrack(playback); final onPrevious = usePreviousTrack(playback); @@ -92,7 +89,7 @@ class PlayerControls extends HookConsumerWidget { children: [ IconButton( icon: const Icon(Icons.shuffle_rounded), - color: _shuffled.value + color: playback.shuffled ? Theme.of(context).primaryColor : iconColor, onPressed: () { @@ -101,12 +98,10 @@ class PlayerControls extends HookConsumerWidget { return; } try { - if (!_shuffled.value) { - playback.currentPlaylist!.shuffle(); - _shuffled.value = true; + if (!playback.shuffled) { + playback.shuffle(); } else { - playback.currentPlaylist!.unshuffle(); - _shuffled.value = false; + playback.unshuffle(); } } catch (e, stack) { logger.e("onShuffle", e, stack); @@ -140,7 +135,6 @@ class PlayerControls extends HookConsumerWidget { try { await player.pause(); await player.seek(Duration.zero); - _shuffled.value = false; playback.reset(); } catch (e, stack) { logger.e("onStop", e, stack); diff --git a/lib/provider/Playback.dart b/lib/provider/Playback.dart index 1cc93fdf..8fe1cf1f 100644 --- a/lib/provider/Playback.dart +++ b/lib/provider/Playback.dart @@ -31,20 +31,24 @@ class CurrentPlaylist { List get trackIds => tracks.map((e) => e.id!).toList(); - void shuffle() { + bool shuffle() { // won't shuffle if already shuffled if (_tempTrack == null) { _tempTrack = [...tracks]; tracks.shuffle(); + return true; } + return false; } - void unshuffle() { + bool unshuffle() { // without _tempTracks unshuffling can't be done if (_tempTrack != null) { tracks = [..._tempTrack!]; _tempTrack = null; + return true; } + return false; } } @@ -66,6 +70,7 @@ class Playback extends ChangeNotifier { StreamSubscription? _positionStreamListener; Duration _prevPosition = Duration.zero; + bool _shuffled = false; AudioPlayer player; YoutubeExplode youtube; @@ -138,6 +143,7 @@ class Playback extends ChangeNotifier { }); } + bool get shuffled => _shuffled; CurrentPlaylist? get currentPlaylist => _currentPlaylist; Track? get currentTrack => _currentTrack; bool get isPlaying => _isPlaying; @@ -158,6 +164,7 @@ class Playback extends ChangeNotifier { void reset() { _logger.v("Playback Reset"); _isPlaying = false; + _shuffled = false; duration = null; _currentPlaylist = null; _currentTrack = null; @@ -265,6 +272,20 @@ class Playback extends ChangeNotifier { _logger.e("startPlaying", e, stack); } } + + void shuffle() { + if (currentPlaylist?.shuffle() == true) { + _shuffled = true; + notifyListeners(); + } + } + + void unshuffle() { + if (currentPlaylist?.unshuffle() == true) { + _shuffled = false; + notifyListeners(); + } + } } final playbackProvider = ChangeNotifierProvider((ref) {