mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
fix(genres): lag while scrolling
This commit is contained in:
parent
0e07506716
commit
dc980b024e
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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]),
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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: () {},
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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 {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user