mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
shuffle button fixed for shared state mobile & desktop
This commit is contained in:
parent
9e98e8f7dd
commit
66a3b97dd0
@ -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);
|
||||
|
@ -31,20 +31,24 @@ class CurrentPlaylist {
|
||||
|
||||
List<String> 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<Duration>? _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<Playback>((ref) {
|
||||
|
Loading…
Reference in New Issue
Block a user