2020 */
2121
2222import 'dart:async' ;
23- import 'dart:math' ;
2423
2524import 'package:fluentui_system_icons/fluentui_system_icons.dart' ;
2625import 'package:flutter/material.dart' ;
2726import 'package:flutter/services.dart' ;
28- import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart' ;
2927import 'package:musify/extensions/l10n.dart' ;
3028import 'package:musify/main.dart' ;
3129import 'package:musify/services/common_services.dart' ;
@@ -73,9 +71,6 @@ class _PlaylistPageState extends State<PlaylistPage> {
7371 late final List <dynamic >
7472 _originalPlaylistList; // Keep original order separately
7573
76- final int _itemsPerPage = 35 ;
77- late final PagingController <int , dynamic > _pagingController;
78-
7974 late final playlistLikeStatus = ValueNotifier <bool >(
8075 isPlaylistAlreadyLiked (widget.playlistId),
8176 );
@@ -104,24 +99,11 @@ class _PlaylistPageState extends State<PlaylistPage> {
10499 @override
105100 void initState () {
106101 super .initState ();
107-
108- _pagingController = PagingController <int , dynamic >(
109- getNextPageKey: (state) {
110- final source = _sourceList;
111- final totalCount = source.length;
112- final currentlyLoaded = state.items? .length ?? 0 ;
113- if (currentlyLoaded >= totalCount) return null ;
114- return currentlyLoaded;
115- },
116- fetchPage: _fetchPage,
117- );
118-
119102 _initializePlaylist ();
120103 }
121104
122105 @override
123106 void dispose () {
124- _pagingController.dispose ();
125107 super .dispose ();
126108 }
127109
@@ -167,17 +149,6 @@ class _PlaylistPageState extends State<PlaylistPage> {
167149 }
168150 }
169151
170- Future <List <dynamic >> _fetchPage (int pageKey) async {
171- try {
172- final source = _sourceList;
173- final startIndex = pageKey;
174- final endIndex = min (startIndex + _itemsPerPage, source.length);
175- return source.sublist (startIndex, endIndex);
176- } catch (error) {
177- rethrow ;
178- }
179- }
180-
181152 @override
182153 Widget build (BuildContext context) {
183154 return Scaffold (
@@ -189,30 +160,28 @@ class _PlaylistPageState extends State<PlaylistPage> {
189160 ),
190161 ),
191162 body: _playlist != null
192- ? PagingListener (
193- controller: _pagingController,
194- builder: (context, state, fetchNextPage) => CustomScrollView (
195- slivers: [
196- SliverToBoxAdapter (child: _buildHeaderSection ()),
197- if (_playlist['list' ].isNotEmpty) ...[
198- SliverPadding (
199- padding: commonListViewBottomPadding,
200- sliver: PagedSliverList (
201- state: state,
202- fetchNextPage: fetchNextPage,
203- builderDelegate: PagedChildBuilderDelegate <dynamic >(
204- itemBuilder: (context, item, index) {
205- final isRemovable =
206- _playlist['source' ] == 'user-created' ;
207- return _buildSongListItem (item, index, isRemovable);
208- },
209- ),
210- ),
163+ ? CustomScrollView (
164+ slivers: [
165+ SliverToBoxAdapter (child: _buildHeaderSection ()),
166+ if ((_playlist['list' ] as List ).isNotEmpty) ...[
167+ SliverPadding (
168+ padding: commonListViewBottomPadding,
169+ sliver: SliverList .builder (
170+ itemCount: _sourceList.length,
171+ itemBuilder: (context, index) {
172+ final isRemovable =
173+ _playlist['source' ] == 'user-created' ;
174+ return _buildSongListItem (
175+ _sourceList[index],
176+ index,
177+ isRemovable,
178+ );
179+ },
211180 ),
212- ] else
213- const SliverFillRemaining (child : SizedBox . expand ()),
214- ] ,
215- ) ,
181+ ),
182+ ] else
183+ const SliverFillRemaining (child : SizedBox . expand ()) ,
184+ ] ,
216185 )
217186 : SizedBox (
218187 height: MediaQuery .sizeOf (context).height - 100 ,
@@ -293,14 +262,8 @@ class _PlaylistPageState extends State<PlaylistPage> {
293262 const SizedBox (height: 16 ),
294263 PlaylistSearchBar (
295264 query: _searchQuery,
296- onChanged: (value) {
297- setState (() => _searchQuery = value);
298- _pagingController.refresh ();
299- },
300- onCleared: () {
301- setState (() => _searchQuery = '' );
302- _pagingController.refresh ();
303- },
265+ onChanged: (value) => setState (() => _searchQuery = value),
266+ onCleared: () => setState (() => _searchQuery = '' ),
304267 ),
305268 ],
306269 const SizedBox (height: 16 ),
@@ -555,7 +518,6 @@ class _PlaylistPageState extends State<PlaylistPage> {
555518 }
556519 });
557520 }
558- _pagingController.refresh ();
559521 } else {
560522 final resolvedId = _playlist['ytid' ]? .toString () ?? widget.playlistId;
561523 final updatedPlaylist = await getPlaylistInfoForWidget (resolvedId);
@@ -568,19 +530,15 @@ class _PlaylistPageState extends State<PlaylistPage> {
568530 );
569531 }
570532 });
571- _pagingController.refresh ();
572533 }
573534 }
574535 }
575536
576- void _updateSongsListOnRemove (int indexOfRemovedSong) {
577- final items = _pagingController.items ?? [];
578- if (indexOfRemovedSong >= items.length) return ;
579-
580- final dynamic songToRemove = items[indexOfRemovedSong];
537+ void _updateSongsListOnRemove (int indexOfRemovedSong, dynamic songToRemove) {
581538 _originalPlaylistList.removeWhere ((s) => s['ytid' ] == songToRemove['ytid' ]);
582539 final playlistId = _playlist['ytid' ];
583540 if (mounted) {
541+ setState (() {});
584542 showToastWithButton (
585543 context,
586544 context.l10n! .songRemoved,
@@ -592,16 +550,14 @@ class _PlaylistPageState extends State<PlaylistPage> {
592550 songToRemove,
593551 indexToInsert: indexOfRemovedSong,
594552 );
595- _pagingController. refresh ( );
553+ if (mounted) setState (() {} );
596554 },
597555 );
598556 } else {
599557 logger.log (
600558 '(_updateSongsListOnRemove): Widget not mounted, cannot show undo toast.' ,
601559 );
602560 }
603-
604- _pagingController.refresh ();
605561 }
606562
607563 String _getSortTypeDisplayText (PlaylistSortType type) {
@@ -634,14 +590,10 @@ class _PlaylistPageState extends State<PlaylistPage> {
634590 _playlist['list' ] = playlist;
635591 break ;
636592 }
637-
638- // Reset paging controller to top
639- _pagingController.refresh ();
640593 }
641594
642595 Widget _buildSongListItem (dynamic song, int index, bool isRemovable) {
643- final items = _pagingController.items ?? [];
644- final totalItems = items.length;
596+ final totalItems = _sourceList.length;
645597 final borderRadius = getItemBorderRadius (index, totalItems);
646598 final isUserCreatedPlaylist = _playlist? ['source' ] == 'user-created' ;
647599 final playlistId = isUserCreatedPlaylist ? _playlist! ['ytid' ] : null ;
@@ -660,7 +612,7 @@ class _PlaylistPageState extends State<PlaylistPage> {
660612 song,
661613 removeOneAtIndex: index,
662614 )) {
663- _updateSongsListOnRemove (index);
615+ _updateSongsListOnRemove (index, song );
664616 }
665617 }
666618 : null ,
0 commit comments