Skip to content

Commit 0a3cc86

Browse files
committed
refactor(playlist_page): remove paging controller and related logic for simplified playlist display (fixes: #776)
1 parent 80edb32 commit 0a3cc86

File tree

3 files changed

+28
-101
lines changed

3 files changed

+28
-101
lines changed

lib/screens/playlist_page.dart

Lines changed: 28 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@
2020
*/
2121

2222
import 'dart:async';
23-
import 'dart:math';
2423

2524
import 'package:fluentui_system_icons/fluentui_system_icons.dart';
2625
import 'package:flutter/material.dart';
2726
import 'package:flutter/services.dart';
28-
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
2927
import 'package:musify/extensions/l10n.dart';
3028
import 'package:musify/main.dart';
3129
import '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,

pubspec.lock

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,6 @@ packages:
275275
url: "https://pub.dev"
276276
source: hosted
277277
version: "2.0.33"
278-
flutter_staggered_grid_view:
279-
dependency: transitive
280-
description:
281-
name: flutter_staggered_grid_view
282-
sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395"
283-
url: "https://pub.dev"
284-
source: hosted
285-
version: "0.7.0"
286278
flutter_test:
287279
dependency: "direct dev"
288280
description: flutter
@@ -373,14 +365,6 @@ packages:
373365
url: "https://pub.dev"
374366
source: hosted
375367
version: "4.1.2"
376-
infinite_scroll_pagination:
377-
dependency: "direct main"
378-
description:
379-
name: infinite_scroll_pagination
380-
sha256: b0d28e37cd8f62490ff6aef63f9db93d4c78b7f11b7c6b26f33c69d8476fda78
381-
url: "https://pub.dev"
382-
source: hosted
383-
version: "5.1.1"
384368
intl:
385369
dependency: "direct main"
386370
description:
@@ -633,14 +617,6 @@ packages:
633617
description: flutter
634618
source: sdk
635619
version: "0.0.0"
636-
sliver_tools:
637-
dependency: transitive
638-
description:
639-
name: sliver_tools
640-
sha256: eae28220badfb9d0559207badcbbc9ad5331aac829a88cb0964d330d2a4636a6
641-
url: "https://pub.dev"
642-
source: hosted
643-
version: "0.2.12"
644620
source_span:
645621
dependency: transitive
646622
description:

pubspec.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ dependencies:
2929
hive_flutter: ^1.1.0
3030
html: ^0.15.6
3131
http: ^1.6.0
32-
infinite_scroll_pagination: ^5.1.1
3332
intl: ^0.20.2
3433
just_audio: 0.10.5
3534
path_provider: ^2.1.5

0 commit comments

Comments
 (0)