fix(genres): lag while scrolling

This commit is contained in:
Kingkor Roy Tirtho 2023-11-14 20:58:16 +06:00
parent 0e07506716
commit dc980b024e
11 changed files with 56 additions and 54 deletions

View File

@ -29,6 +29,7 @@ class ArtistAlbumList extends HookConsumerWidget {
final theme = Theme.of(context); final theme = Theme.of(context);
return HorizontalPlaybuttonCardView<Album>( return HorizontalPlaybuttonCardView<Album>(
isLoadingNextPage: albumsQuery.isLoadingNextPage,
hasNextPage: albumsQuery.hasNextPage, hasNextPage: albumsQuery.hasNextPage,
items: albums, items: albums,
onFetchMore: albumsQuery.fetchNext, onFetchMore: albumsQuery.fetchNext,

View File

@ -42,6 +42,7 @@ class CategoryCard extends HookConsumerWidget {
return HorizontalPlaybuttonCardView<PlaylistSimple>( return HorizontalPlaybuttonCardView<PlaylistSimple>(
title: Text(category.name!), title: Text(category.name!),
isLoadingNextPage: playlistQuery.isLoadingNextPage,
hasNextPage: playlistQuery.hasNextPage, hasNextPage: playlistQuery.hasNextPage,
items: playlists, items: playlists,
onFetchMore: playlistQuery.fetchNext, onFetchMore: playlistQuery.fetchNext,

View File

@ -7,19 +7,22 @@ import 'package:spotube/components/album/album_card.dart';
import 'package:spotube/components/artist/artist_card.dart'; import 'package:spotube/components/artist/artist_card.dart';
import 'package:spotube/components/playlist/playlist_card.dart'; import 'package:spotube/components/playlist/playlist_card.dart';
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart'; import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
import 'package:spotube/components/shared/waypoint.dart';
import 'package:spotube/hooks/utils/use_breakpoint_value.dart'; import 'package:spotube/hooks/utils/use_breakpoint_value.dart';
import 'package:very_good_infinite_list/very_good_infinite_list.dart';
class HorizontalPlaybuttonCardView<T> extends HookWidget { class HorizontalPlaybuttonCardView<T> extends HookWidget {
final Widget title; final Widget title;
final List<T> items; final List<T> items;
final VoidCallback onFetchMore; final VoidCallback onFetchMore;
final bool isLoadingNextPage;
final bool hasNextPage; final bool hasNextPage;
const HorizontalPlaybuttonCardView({ const HorizontalPlaybuttonCardView({
required this.title, required this.title,
required this.items, required this.items,
required this.hasNextPage, required this.hasNextPage,
required this.onFetchMore, required this.onFetchMore,
required this.isLoadingNextPage,
Key? key, Key? key,
}) : assert( }) : assert(
items is List<PlaylistSimple> || items is List<PlaylistSimple> ||
@ -58,23 +61,18 @@ class HorizontalPlaybuttonCardView<T> extends HookWidget {
PointerDeviceKind.mouse, PointerDeviceKind.mouse,
}, },
), ),
child: ListView.builder( child: InfiniteList(
controller: scrollController, scrollController: scrollController,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(vertical: 8.0), padding: const EdgeInsets.symmetric(vertical: 8.0),
itemCount: items.length + 1, itemCount: items.length,
onFetchData: onFetchMore,
loadingBuilder: (context) => const ShimmerPlaybuttonCard(),
emptyBuilder: (context) =>
const ShimmerPlaybuttonCard(count: 5),
isLoading: isLoadingNextPage,
hasReachedMax: !hasNextPage,
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == items.length) {
if (!hasNextPage) {
return const SizedBox.shrink();
}
return Waypoint(
controller: scrollController,
onTouchEdge: onFetchMore,
isGrid: true,
child: const ShimmerPlaybuttonCard(),
);
}
final item = items[index]; final item = items[index];
return switch (item.runtimeType) { return switch (item.runtimeType) {

View File

@ -7,12 +7,12 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/genre/category_card.dart'; import 'package:spotube/components/genre/category_card.dart';
import 'package:spotube/components/shared/expandable_search/expandable_search.dart'; import 'package:spotube/components/shared/expandable_search/expandable_search.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/components/shared/shimmers/shimmer_categories.dart'; import 'package:spotube/components/shared/shimmers/shimmer_categories.dart';
import 'package:spotube/components/shared/waypoint.dart'; import 'package:spotube/components/shared/waypoint.dart';
import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/services/queries/queries.dart'; import 'package:spotube/services/queries/queries.dart';
import 'package:very_good_infinite_list/very_good_infinite_list.dart';
class GenrePage extends HookConsumerWidget { class GenrePage extends HookConsumerWidget {
const GenrePage({Key? key}) : super(key: key); const GenrePage({Key? key}) : super(key: key);
@ -79,24 +79,15 @@ class GenrePage extends HookConsumerWidget {
const ShimmerCategories() const ShimmerCategories()
else else
Expanded( Expanded(
child: ListView.builder( child: InfiniteList(
controller: scrollController, scrollController: scrollController,
itemCount: categories.length, itemCount: categories.length,
onFetchData: categoriesQuery.fetchNext,
isLoading: categoriesQuery.isLoadingNextPage,
hasReachedMax: !categoriesQuery.hasNextPage,
loadingBuilder: (context) => const ShimmerCategories(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return AnimatedSwitcher( return CategoryCard(categories[index]);
transitionBuilder: (child, animation) {
return FadeTransition(
opacity: animation,
child: child,
);
},
duration: const Duration(milliseconds: 300),
child: searchController.text.isEmpty &&
index == categories.length - 1 &&
categoriesQuery.hasNextPage
? const ShimmerCategories()
: CategoryCard(categories[index]),
);
}, },
), ),
), ),

View File

@ -56,6 +56,7 @@ class PersonalizedPage extends HookConsumerWidget {
HorizontalPlaybuttonCardView<PlaylistSimple>( HorizontalPlaybuttonCardView<PlaylistSimple>(
items: playlists.toList(), items: playlists.toList(),
title: Text(context.l10n.featured), title: Text(context.l10n.featured),
isLoadingNextPage: featuredPlaylistsQuery.isLoadingNextPage,
hasNextPage: featuredPlaylistsQuery.hasNextPage, hasNextPage: featuredPlaylistsQuery.hasNextPage,
onFetchMore: featuredPlaylistsQuery.fetchNext, onFetchMore: featuredPlaylistsQuery.fetchNext,
), ),
@ -66,6 +67,7 @@ class PersonalizedPage extends HookConsumerWidget {
HorizontalPlaybuttonCardView<Album>( HorizontalPlaybuttonCardView<Album>(
items: albums, items: albums,
title: Text(context.l10n.new_releases), title: Text(context.l10n.new_releases),
isLoadingNextPage: newReleases.isLoadingNextPage,
hasNextPage: newReleases.hasNextPage, hasNextPage: newReleases.hasNextPage,
onFetchMore: newReleases.fetchNext, onFetchMore: newReleases.fetchNext,
), ),
@ -81,6 +83,7 @@ class PersonalizedPage extends HookConsumerWidget {
items: playlists, items: playlists,
title: Text(item["name"] ?? ""), title: Text(item["name"] ?? ""),
hasNextPage: false, hasNextPage: false,
isLoadingNextPage: false,
onFetchMore: () {}, onFetchMore: () {},
); );
}) })

View File

@ -30,6 +30,7 @@ class SearchAlbumsSection extends HookConsumerWidget {
); );
return HorizontalPlaybuttonCardView( return HorizontalPlaybuttonCardView(
isLoadingNextPage: query.isLoadingNextPage,
hasNextPage: query.hasNextPage, hasNextPage: query.hasNextPage,
items: albums, items: albums,
onFetchMore: query.fetchNext, onFetchMore: query.fetchNext,

View File

@ -28,6 +28,7 @@ class SearchArtistsSection extends HookConsumerWidget {
); );
return HorizontalPlaybuttonCardView<Artist>( return HorizontalPlaybuttonCardView<Artist>(
isLoadingNextPage: query.isLoadingNextPage,
hasNextPage: query.hasNextPage, hasNextPage: query.hasNextPage,
items: artists, items: artists,
onFetchMore: query.fetchNext, onFetchMore: query.fetchNext,

View File

@ -26,6 +26,7 @@ class SearchPlaylistsSection extends HookConsumerWidget {
); );
return HorizontalPlaybuttonCardView( return HorizontalPlaybuttonCardView(
isLoadingNextPage: query.isLoadingNextPage,
hasNextPage: query.hasNextPage, hasNextPage: query.hasNextPage,
items: playlists, items: playlists,
onFetchMore: query.fetchNext, onFetchMore: query.fetchNext,

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart'; import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/pages/settings/sections/about.dart'; import 'package:spotube/pages/settings/sections/about.dart';
@ -37,8 +36,6 @@ class SettingsPage extends HookConsumerWidget {
Flexible( Flexible(
child: Container( child: Container(
constraints: const BoxConstraints(maxWidth: 1366), constraints: const BoxConstraints(maxWidth: 1366),
child: InterScrollbar(
controller: controller,
child: ListView( child: ListView(
controller: controller, controller: controller,
children: [ children: [
@ -62,7 +59,6 @@ class SettingsPage extends HookConsumerWidget {
), ),
), ),
), ),
),
], ],
), ),
), ),

View File

@ -2180,6 +2180,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.0.2"
very_good_infinite_list:
dependency: "direct main"
description:
name: very_good_infinite_list
sha256: "6f5ad429edbce6084e1c600e56b26b1de8c6b138e8e8fc2de41b686166029aa5"
url: "https://pub.dev"
source: hosted
version: "0.7.1"
visibility_detector: visibility_detector:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -110,6 +110,7 @@ dependencies:
git: git:
url: https://github.com/thielepaul/flutter-draggable-scrollbar.git url: https://github.com/thielepaul/flutter-draggable-scrollbar.git
ref: cfd570035bf393de541d32e9b28808b5d7e602df ref: cfd570035bf393de541d32e9b28808b5d7e602df
very_good_infinite_list: ^0.7.1
dev_dependencies: dev_dependencies:
build_runner: ^2.3.2 build_runner: ^2.3.2