Skip to content

Commit 8b42f64

Browse files
committed
fix: fixed several playback and recommendation issues
1 parent 95e7b97 commit 8b42f64

File tree

5 files changed

+112
-156
lines changed

5 files changed

+112
-156
lines changed

lib/screens/now_playing_page.dart

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,16 @@ import 'package:musify/widgets/song_artwork.dart';
4040
import 'package:musify/widgets/song_bar.dart';
4141
import 'package:musify/widgets/spinner.dart';
4242

43-
final _lyricsController = FlipCardController();
44-
45-
class NowPlayingPage extends StatelessWidget {
43+
class NowPlayingPage extends StatefulWidget {
4644
const NowPlayingPage({super.key});
4745

46+
@override
47+
State<NowPlayingPage> createState() => _NowPlayingPageState();
48+
}
49+
50+
class _NowPlayingPageState extends State<NowPlayingPage> {
51+
final _lyricsController = FlipCardController();
52+
4853
@override
4954
Widget build(BuildContext context) {
5055
final size = MediaQuery.sizeOf(context);
@@ -79,13 +84,15 @@ class NowPlayingPage extends StatelessWidget {
7984
size: size,
8085
adjustedIconSize: adjustedIconSize,
8186
adjustedMiniIconSize: adjustedMiniIconSize,
87+
lyricsController: _lyricsController,
8288
)
8389
: _MobileLayout(
8490
metadata: metadata,
8591
size: size,
8692
adjustedIconSize: adjustedIconSize,
8793
adjustedMiniIconSize: adjustedMiniIconSize,
8894
isLargeScreen: isLargeScreen,
95+
lyricsController: _lyricsController,
8996
);
9097
}
9198
},
@@ -101,11 +108,13 @@ class _DesktopLayout extends StatelessWidget {
101108
required this.size,
102109
required this.adjustedIconSize,
103110
required this.adjustedMiniIconSize,
111+
required this.lyricsController,
104112
});
105113
final MediaItem metadata;
106114
final Size size;
107115
final double adjustedIconSize;
108116
final double adjustedMiniIconSize;
117+
final FlipCardController lyricsController;
109118

110119
@override
111120
Widget build(BuildContext context) {
@@ -115,7 +124,11 @@ class _DesktopLayout extends StatelessWidget {
115124
child: Column(
116125
children: [
117126
const SizedBox(height: 5),
118-
NowPlayingArtwork(size: size, metadata: metadata),
127+
NowPlayingArtwork(
128+
size: size,
129+
metadata: metadata,
130+
lyricsController: lyricsController,
131+
),
119132
const SizedBox(height: 5),
120133
if (!(metadata.extras?['isLive'] ?? false))
121134
NowPlayingControls(
@@ -142,19 +155,25 @@ class _MobileLayout extends StatelessWidget {
142155
required this.adjustedIconSize,
143156
required this.adjustedMiniIconSize,
144157
required this.isLargeScreen,
158+
required this.lyricsController,
145159
});
146160
final MediaItem metadata;
147161
final Size size;
148162
final double adjustedIconSize;
149163
final double adjustedMiniIconSize;
150164
final bool isLargeScreen;
165+
final FlipCardController lyricsController;
151166

152167
@override
153168
Widget build(BuildContext context) {
154169
return Column(
155170
spacing: 10,
156171
children: [
157-
NowPlayingArtwork(size: size, metadata: metadata),
172+
NowPlayingArtwork(
173+
size: size,
174+
metadata: metadata,
175+
lyricsController: lyricsController,
176+
),
158177
if (!(metadata.extras?['isLive'] ?? false))
159178
NowPlayingControls(
160179
size: size,
@@ -169,6 +188,7 @@ class _MobileLayout extends StatelessWidget {
169188
metadata: metadata,
170189
iconSize: adjustedMiniIconSize,
171190
isLargeScreen: isLargeScreen,
191+
lyricsController: lyricsController,
172192
),
173193
const SizedBox(height: 2),
174194
],
@@ -182,9 +202,11 @@ class NowPlayingArtwork extends StatelessWidget {
182202
super.key,
183203
required this.size,
184204
required this.metadata,
205+
required this.lyricsController,
185206
});
186207
final Size size;
187208
final MediaItem metadata;
209+
final FlipCardController lyricsController;
188210

189211
@override
190212
Widget build(BuildContext context) {
@@ -204,7 +226,7 @@ class NowPlayingArtwork extends StatelessWidget {
204226
return FlipCard(
205227
rotateSide: RotateSide.right,
206228
onTapFlipping: !offlineMode.value,
207-
controller: _lyricsController,
229+
controller: lyricsController,
208230
frontWidget: SongArtworkWidget(
209231
metadata: metadata,
210232
size: imageSize,
@@ -369,7 +391,7 @@ class PlayerControlButtons extends StatelessWidget {
369391
children: <Widget>[
370392
_buildShuffleButton(_primaryColor, _secondaryColor, miniIconSize),
371393
StreamBuilder<List<MediaItem>>(
372-
stream: audioHandler.queueStream,
394+
stream: audioHandler.queue,
373395
builder: (context, snapshot) {
374396
return ValueListenableBuilder<AudioServiceRepeatMode>(
375397
valueListenable: repeatNotifier,
@@ -459,7 +481,7 @@ class PlayerControlButtons extends StatelessWidget {
459481
double iconSize,
460482
) {
461483
return StreamBuilder<List<MediaItem>>(
462-
stream: audioHandler.queueStream,
484+
stream: audioHandler.queue,
463485
builder: (context, snapshot) {
464486
final queue = snapshot.data ?? [];
465487
return ValueListenableBuilder<AudioServiceRepeatMode>(
@@ -514,11 +536,13 @@ class BottomActionsRow extends StatelessWidget {
514536
required this.metadata,
515537
required this.iconSize,
516538
required this.isLargeScreen,
539+
required this.lyricsController,
517540
});
518541
final dynamic audioId;
519542
final MediaItem metadata;
520543
final double iconSize;
521544
final bool isLargeScreen;
545+
final FlipCardController lyricsController;
522546

523547
Widget _buildOfflineButton(ValueNotifier<bool> status, Color primaryColor) {
524548
return ValueListenableBuilder<bool>(
@@ -532,28 +556,28 @@ class BottomActionsRow extends StatelessWidget {
532556
color: primaryColor,
533557
),
534558
iconSize: iconSize,
535-
onPressed: () async {
536-
final originalValue = value;
537-
status.value = !value;
538-
539-
try {
540-
final bool success;
541-
if (originalValue) {
542-
success = await removeSongFromOffline(audioId);
543-
} else {
544-
success = await makeSongOffline(mediaItemToMap(metadata));
545-
}
546-
547-
// Revert if operation failed
548-
if (!success) {
549-
status.value = originalValue;
550-
}
551-
} catch (e) {
552-
// Revert on error
553-
status.value = originalValue;
554-
logger.log('Error toggling offline status', e, null);
555-
}
556-
},
559+
onPressed: audioId == null
560+
? null
561+
: () async {
562+
final originalValue = value;
563+
status.value = !value;
564+
565+
try {
566+
final bool success;
567+
if (originalValue) {
568+
success = await removeSongFromOffline(audioId);
569+
} else {
570+
success = await makeSongOffline(mediaItemToMap(metadata));
571+
}
572+
573+
if (!success) {
574+
status.value = originalValue;
575+
}
576+
} catch (e) {
577+
status.value = originalValue;
578+
logger.log('Error toggling offline status', e, null);
579+
}
580+
},
557581
);
558582
},
559583
);
@@ -580,7 +604,7 @@ class BottomActionsRow extends StatelessWidget {
580604
final _primaryColor = Theme.of(context).colorScheme.primary;
581605

582606
return StreamBuilder<List<MediaItem>>(
583-
stream: audioHandler.queueStream,
607+
stream: audioHandler.queue,
584608
builder: (context, snapshot) {
585609
final queue = snapshot.data ?? [];
586610
final mappedQueue = queue.isNotEmpty
@@ -643,7 +667,7 @@ class BottomActionsRow extends StatelessWidget {
643667
return IconButton.filledTonal(
644668
icon: Icon(FluentIcons.text_32_filled, color: primaryColor),
645669
iconSize: iconSize,
646-
onPressed: _lyricsController.flipcard,
670+
onPressed: lyricsController.flipcard,
647671
);
648672
}
649673

0 commit comments

Comments
 (0)