@@ -40,11 +40,16 @@ import 'package:musify/widgets/song_artwork.dart';
4040import 'package:musify/widgets/song_bar.dart' ;
4141import '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