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,29 +36,26 @@ class SettingsPage extends HookConsumerWidget {
Flexible( Flexible(
child: Container( child: Container(
constraints: const BoxConstraints(maxWidth: 1366), constraints: const BoxConstraints(maxWidth: 1366),
child: InterScrollbar( child: ListView(
controller: controller, controller: controller,
child: ListView( children: [
controller: controller, const SettingsAccountSection(),
children: [ const SettingsLanguageRegionSection(),
const SettingsAccountSection(), const SettingsAppearanceSection(),
const SettingsLanguageRegionSection(), const SettingsPlaybackSection(),
const SettingsAppearanceSection(), const SettingsDownloadsSection(),
const SettingsPlaybackSection(), if (DesktopTools.platform.isDesktop)
const SettingsDownloadsSection(), const SettingsDesktopSection(),
if (DesktopTools.platform.isDesktop) if (!kIsWeb) const SettingsDevelopersSection(),
const SettingsDesktopSection(), const SettingsAboutSection(),
if (!kIsWeb) const SettingsDevelopersSection(), Center(
const SettingsAboutSection(), child: FilledButton(
Center( onPressed: preferencesNotifier.reset,
child: FilledButton( child: Text(context.l10n.restore_defaults),
onPressed: preferencesNotifier.reset,
child: Text(context.l10n.restore_defaults),
),
), ),
const SizedBox(height: 10), ),
], const SizedBox(height: 10),
), ],
), ),
), ),
), ),

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