chore: remove direct access to .value without calling asData.value

This commit is contained in:
Kingkor Roy Tirtho 2024-03-23 20:37:52 +06:00
parent 82b1cfa0d7
commit ee97aedcfc
20 changed files with 56 additions and 51 deletions

View File

@ -4,10 +4,12 @@
"acousticness", "acousticness",
"Buildless", "Buildless",
"danceability", "danceability",
"fuzzywuzzy",
"instrumentalness", "instrumentalness",
"Mpris", "Mpris",
"riverpod", "riverpod",
"Scrobblenaut", "Scrobblenaut",
"skeletonizer",
"speechiness", "speechiness",
"Spotube", "Spotube",
"winget" "winget"

View File

@ -26,12 +26,12 @@ class HomeGenresSection extends HookConsumerWidget {
final categoriesQuery = ref.watch(categoriesProvider); final categoriesQuery = ref.watch(categoriesProvider);
final categories = useMemoized( final categories = useMemoized(
() => () =>
categoriesQuery.value categoriesQuery.asData?.value
?.where((c) => (c.icons?.length ?? 0) > 0) .where((c) => (c.icons?.length ?? 0) > 0)
.take(mediaQuery.mdAndDown ? 6 : 10) .take(mediaQuery.mdAndDown ? 6 : 10)
.toList() ?? .toList() ??
<Category>[], <Category>[],
[mediaQuery.mdAndDown, categoriesQuery.value], [mediaQuery.mdAndDown, categoriesQuery.asData?.value],
); );
return SliverMainAxisGroup( return SliverMainAxisGroup(

View File

@ -12,9 +12,9 @@ class HomeMadeForUserSection extends HookConsumerWidget {
final madeForUser = ref.watch(viewProvider("made-for-x-hub")); final madeForUser = ref.watch(viewProvider("made-for-x-hub"));
return SliverList.builder( return SliverList.builder(
itemCount: madeForUser.value?["content"]?["items"]?.length ?? 0, itemCount: madeForUser.asData?.value["content"]?["items"]?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final item = madeForUser.value?["content"]?["items"]?[index]; final item = madeForUser.asData?.value["content"]?["items"]?[index];
final playlists = item["content"]?["items"] final playlists = item["content"]?["items"]
?.where((itemL2) => itemL2["type"] == "playlist") ?.where((itemL2) => itemL2["type"] == "playlist")
.map((itemL2) => PlaylistSimple.fromJson(itemL2)) .map((itemL2) => PlaylistSimple.fromJson(itemL2))

View File

@ -44,7 +44,7 @@ class UserAlbums extends HookConsumerWidget {
.map((e) => e.$2) .map((e) => e.$2)
.toList() ?? .toList() ??
[]; [];
}, [albumsQuery.value, searchText.value]); }, [albumsQuery.asData?.value, searchText.value]);
if (auth == null) { if (auth == null) {
return const AnonymousFallback(); return const AnonymousFallback();
@ -87,8 +87,8 @@ class UserAlbums extends HookConsumerWidget {
runAlignment: WrapAlignment.center, runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center, crossAxisAlignment: WrapCrossAlignment.center,
children: [ children: [
if (albumsQuery.value == null || if (albumsQuery.asData?.value == null ||
albumsQuery.value!.items.isEmpty) albumsQuery.asData!.value.items.isEmpty)
...List.generate( ...List.generate(
10, 10,
(index) => AlbumCard(FakeData.album), (index) => AlbumCard(FakeData.album),

View File

@ -160,7 +160,7 @@ class UserLocalTracks extends HookConsumerWidget {
final playlist = ref.watch(ProxyPlaylistNotifier.provider); final playlist = ref.watch(ProxyPlaylistNotifier.provider);
final trackSnapshot = ref.watch(localTracksProvider); final trackSnapshot = ref.watch(localTracksProvider);
final isPlaylistPlaying = final isPlaylistPlaying =
playlist.containsTracks(trackSnapshot.value ?? []); playlist.containsTracks(trackSnapshot.asData?.value ?? []);
final searchController = useTextEditingController(); final searchController = useTextEditingController();
useValueListenable(searchController); useValueListenable(searchController);
@ -177,13 +177,13 @@ class UserLocalTracks extends HookConsumerWidget {
children: [ children: [
const SizedBox(width: 10), const SizedBox(width: 10),
FilledButton( FilledButton(
onPressed: trackSnapshot.value != null onPressed: trackSnapshot.asData?.value != null
? () async { ? () async {
if (trackSnapshot.asData?.value.isNotEmpty == true) { if (trackSnapshot.asData?.value.isNotEmpty == true) {
if (!isPlaylistPlaying) { if (!isPlaylistPlaying) {
await playLocalTracks( await playLocalTracks(
ref, ref,
trackSnapshot.value!, trackSnapshot.asData!.value,
); );
} else { } else {
// TODO: Remove stop capability // TODO: Remove stop capability

View File

@ -68,7 +68,7 @@ UseTrackToggleLike useTrackToggleLike(Track track, WidgetRef ref) {
() => () =>
savedTracks.asData?.value.any((element) => element.id == track.id) ?? savedTracks.asData?.value.any((element) => element.id == track.id) ??
false, false,
[savedTracks.value, track.id], [savedTracks.asData?.value, track.id],
); );
final scrobblerNotifier = ref.read(scrobblerProvider.notifier); final scrobblerNotifier = ref.read(scrobblerProvider.notifier);
@ -109,7 +109,7 @@ class TrackHeartButton extends HookConsumerWidget {
? context.l10n.remove_from_favorites ? context.l10n.remove_from_favorites
: context.l10n.save_as_favorite, : context.l10n.save_as_favorite,
isLiked: isLiked, isLiked: isLiked,
onPressed: savedTracks.value != null onPressed: savedTracks.asData?.value != null
? () { ? () {
toggleTrackLike(track); toggleTrackLike(track);
} }

View File

@ -348,7 +348,7 @@ class TrackOptions extends HookConsumerWidget {
leading: const Icon(SpotubeIcons.queueRemove), leading: const Icon(SpotubeIcons.queueRemove),
title: Text(context.l10n.remove_from_queue), title: Text(context.l10n.remove_from_queue),
), ),
if (me.value != null) if (me.asData?.value != null)
PopSheetEntry( PopSheetEntry(
value: TrackOptionValue.favorite, value: TrackOptionValue.favorite,
leading: favorites.isLiked leading: favorites.isLiked

View File

@ -10,9 +10,9 @@ bool useIsUserPlaylist(WidgetRef ref, String playlistId) {
() => () =>
userPlaylistsQuery.asData?.value.items.any((e) => userPlaylistsQuery.asData?.value.items.any((e) =>
e.id == playlistId && e.id == playlistId &&
me.value != null && me.asData?.value != null &&
e.owner?.id == me.asData?.value.id) ?? e.owner?.id == me.asData?.value.id) ??
false, false,
[userPlaylistsQuery.value, playlistId, me.value], [userPlaylistsQuery.asData?.value, playlistId, me.asData?.value],
); );
} }

View File

@ -45,11 +45,11 @@ class AlbumPage extends HookConsumerWidget {
), ),
routePath: "/album/${album.id}", routePath: "/album/${album.id}",
shareUrl: album.externalUrls!.spotify!, shareUrl: album.externalUrls!.spotify!,
isLiked: isSavedAlbum.value ?? false, isLiked: isSavedAlbum.asData?.value ?? false,
onHeart: isSavedAlbum.value == null onHeart: isSavedAlbum.asData?.value == null
? null ? null
: () async { : () async {
if (isSavedAlbum.value!) { if (isSavedAlbum.asData!.value) {
await favoriteAlbumsNotifier.removeFavorites([album.id!]); await favoriteAlbumsNotifier.removeFavorites([album.id!]);
} else { } else {
await favoriteAlbumsNotifier.addFavorites([album.id!]); await favoriteAlbumsNotifier.addFavorites([album.id!]);

View File

@ -35,7 +35,7 @@ class ArtistPage extends HookConsumerWidget {
), ),
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
body: Builder(builder: (context) { body: Builder(builder: (context) {
if (artistQuery.hasError && artistQuery.value == null) { if (artistQuery.hasError && artistQuery.asData?.value == null) {
return Center(child: Text(artistQuery.error.toString())); return Center(child: Text(artistQuery.error.toString()));
} }
return Skeletonizer( return Skeletonizer(
@ -66,11 +66,12 @@ class ArtistPage extends HookConsumerWidget {
SliverSafeArea( SliverSafeArea(
sliver: ArtistPageRelatedArtists(artistId: artistId), sliver: ArtistPageRelatedArtists(artistId: artistId),
), ),
if (artistQuery.value != null) if (artistQuery.asData?.value != null)
SliverSafeArea( SliverSafeArea(
top: false, top: false,
sliver: SliverToBoxAdapter( sliver: SliverToBoxAdapter(
child: ArtistPageFooter(artist: artistQuery.value!), child:
ArtistPageFooter(artist: artistQuery.asData!.value),
), ),
), ),
], ],

View File

@ -23,7 +23,7 @@ class ArtistPageFooter extends ConsumerWidget {
placeholder: ImagePlaceholder.artist, placeholder: ImagePlaceholder.artist,
); );
final summary = ref.watch(artistWikipediaSummaryProvider(artist)); final summary = ref.watch(artistWikipediaSummaryProvider(artist));
if (summary.value == null) return const SizedBox.shrink(); if (summary.asData?.value == null) return const SizedBox.shrink();
return Container( return Container(
margin: const EdgeInsets.all(16), margin: const EdgeInsets.all(16),
@ -39,9 +39,9 @@ class ArtistPageFooter extends ConsumerWidget {
BlendMode.darken, BlendMode.darken,
), ),
image: UniversalImage.imageProvider( image: UniversalImage.imageProvider(
summary.value!.thumbnail?.source_ ?? artistImage, summary.asData?.value!.thumbnail?.source_ ?? artistImage,
height: summary.value!.thumbnail?.height.toDouble(), height: summary.asData?.value!.thumbnail?.height.toDouble(),
width: summary.value!.thumbnail?.width.toDouble(), width: summary.asData?.value!.thumbnail?.width.toDouble(),
), ),
fit: BoxFit.cover, fit: BoxFit.cover,
alignment: Alignment.center, alignment: Alignment.center,
@ -70,7 +70,7 @@ class ArtistPageFooter extends ConsumerWidget {
), ),
const TextSpan(text: '\n\n'), const TextSpan(text: '\n\n'),
TextSpan( TextSpan(
text: summary.value!.extract, text: summary.asData?.value!.extract,
), ),
TextSpan( TextSpan(
text: '\n...read more at wikipedia', text: '\n...read more at wikipedia',

View File

@ -22,7 +22,7 @@ class ArtistPageHeader extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final artistQuery = ref.watch(artistProvider(artistId)); final artistQuery = ref.watch(artistProvider(artistId));
final artist = artistQuery.value ?? FakeData.artist; final artist = artistQuery.asData?.value ?? FakeData.artist;
final scaffoldMessenger = ScaffoldMessenger.of(context); final scaffoldMessenger = ScaffoldMessenger.of(context);
final mediaQuery = MediaQuery.of(context); final mediaQuery = MediaQuery.of(context);

View File

@ -23,7 +23,7 @@ class ArtistPageTopTracks extends HookConsumerWidget {
final topTracksQuery = ref.watch(artistTopTracksProvider(artistId)); final topTracksQuery = ref.watch(artistTopTracksProvider(artistId));
final isPlaylistPlaying = playlist.containsTracks( final isPlaylistPlaying = playlist.containsTracks(
topTracksQuery.value ?? <Track>[], topTracksQuery.asData?.value ?? <Track>[],
); );
if (topTracksQuery.hasError) { if (topTracksQuery.hasError) {
@ -34,8 +34,8 @@ class ArtistPageTopTracks extends HookConsumerWidget {
); );
} }
final topTracks = final topTracks = topTracksQuery.asData?.value ??
topTracksQuery.value ?? List.generate(10, (index) => FakeData.track); List.generate(10, (index) => FakeData.track);
void playPlaylist(List<Track> tracks, {Track? currentTrack}) async { void playPlaylist(List<Track> tracks, {Track? currentTrack}) async {
currentTrack ??= tracks.first; currentTrack ??= tracks.first;

View File

@ -39,9 +39,9 @@ class GenrePage extends HookConsumerWidget {
crossAxisSpacing: 12, crossAxisSpacing: 12,
mainAxisSpacing: 12, mainAxisSpacing: 12,
), ),
itemCount: categories.value!.length, itemCount: categories.asData!.value.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final category = categories.value![index]; final category = categories.asData!.value[index];
final gradient = gradients[Random().nextInt(gradients.length)]; final gradient = gradients[Random().nextInt(gradients.length)];
return InkWell( return InkWell(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),

View File

@ -187,7 +187,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
); );
final genreSelector = MultiSelectField<String>( final genreSelector = MultiSelectField<String>(
options: genresCollection.value ?? [], options: genresCollection.asData?.value ?? [],
selectedOptions: genres.value, selectedOptions: genres.value,
getValueForOption: (option) => option, getValueForOption: (option) => option,
onSelected: (value) { onSelected: (value) {

View File

@ -34,12 +34,12 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
); );
useEffect(() { useEffect(() {
if (generatedPlaylist.value != null) { if (generatedPlaylist.asData?.value != null) {
selectedTracks.value = selectedTracks.value =
generatedPlaylist.value!.map((e) => e.id!).toList(); generatedPlaylist.asData!.value.map((e) => e.id!).toList();
} }
return null; return null;
}, [generatedPlaylist.value]); }, [generatedPlaylist.asData?.value]);
final isAllTrackSelected = selectedTracks.value.length == final isAllTrackSelected = selectedTracks.value.length ==
(generatedPlaylist.asData?.value.length ?? 0); (generatedPlaylist.asData?.value.length ?? 0);
@ -78,7 +78,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
? null ? null
: () async { : () async {
await playlistNotifier.load( await playlistNotifier.load(
generatedPlaylist.value!.where( generatedPlaylist.asData!.value.where(
(e) => selectedTracks.value.contains(e.id!), (e) => selectedTracks.value.contains(e.id!),
), ),
autoPlay: true, autoPlay: true,
@ -92,7 +92,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
? null ? null
: () async { : () async {
await playlistNotifier.addTracks( await playlistNotifier.addTracks(
generatedPlaylist.value!.where( generatedPlaylist.asData!.value.where(
(e) => selectedTracks.value.contains(e.id!), (e) => selectedTracks.value.contains(e.id!),
), ),
); );
@ -142,7 +142,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
openFromPlaylist: null, openFromPlaylist: null,
tracks: selectedTracks.value tracks: selectedTracks.value
.map( .map(
(e) => generatedPlaylist.value! (e) => generatedPlaylist.asData!.value
.firstWhere( .firstWhere(
(element) => element.id == e, (element) => element.id == e,
), ),
@ -167,7 +167,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
], ],
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
if (generatedPlaylist.value != null) if (generatedPlaylist.asData?.value != null)
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
@ -181,8 +181,9 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
if (isAllTrackSelected) { if (isAllTrackSelected) {
selectedTracks.value = []; selectedTracks.value = [];
} else { } else {
selectedTracks.value = generatedPlaylist.value selectedTracks.value = generatedPlaylist
?.map((e) => e.id!) .asData?.value
.map((e) => e.id!)
.toList() ?? .toList() ??
[]; [];
} }
@ -203,7 +204,8 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
for (final track in generatedPlaylist.value ?? []) for (final track
in generatedPlaylist.asData?.value ?? [])
CheckboxListTile( CheckboxListTile(
value: selectedTracks.value.contains(track.id), value: selectedTracks.value.contains(track.id),
onChanged: (value) { onChanged: (value) {

View File

@ -15,7 +15,7 @@ class LikedPlaylistPage extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final likedTracks = ref.watch(likedTracksProvider); final likedTracks = ref.watch(likedTracksProvider);
final tracks = likedTracks.value ?? <Track>[]; final tracks = likedTracks.asData?.value ?? <Track>[];
return InheritedTrackView( return InheritedTrackView(
collectionId: playlist.id!, collectionId: playlist.id!,

View File

@ -48,9 +48,9 @@ class PlaylistPage extends HookConsumerWidget {
description: playlist.description, description: playlist.description,
tracks: tracks.asData?.value.items ?? [], tracks: tracks.asData?.value.items ?? [],
routePath: '/playlist/${playlist.id}', routePath: '/playlist/${playlist.id}',
isLiked: isFavoritePlaylist.value ?? false, isLiked: isFavoritePlaylist.asData?.value ?? false,
shareUrl: playlist.externalUrls?.spotify ?? "", shareUrl: playlist.externalUrls?.spotify ?? "",
onHeart: isFavoritePlaylist.value == null onHeart: isFavoritePlaylist.asData?.value == null
? null ? null
: () async { : () async {
final confirmed = isUserPlaylist final confirmed = isUserPlaylist
@ -62,7 +62,7 @@ class PlaylistPage extends HookConsumerWidget {
: true; : true;
if (!confirmed) return null; if (!confirmed) return null;
if (isFavoritePlaylist.value!) { if (isFavoritePlaylist.asData!.value) {
await favoritePlaylistsNotifier.removeFavorite(playlist); await favoritePlaylistsNotifier.removeFavorite(playlist);
} else { } else {
await favoritePlaylistsNotifier.addFavorite(playlist); await favoritePlaylistsNotifier.addFavorite(playlist);

View File

@ -168,8 +168,8 @@ class SearchPage extends HookConsumerWidget {
}, },
builder: (context, controller) { builder: (context, controller) {
return SearchBar( return SearchBar(
autoFocus: queries.none( autoFocus: queries.none((s) =>
(s) => s.value != null && !s.hasError) && s.asData?.value != null && !s.hasError) &&
!kIsMobile, !kIsMobile,
controller: controller, controller: controller,
leading: const Icon(SpotubeIcons.search), leading: const Icon(SpotubeIcons.search),

View File

@ -24,7 +24,7 @@ class SearchAlbumsSection extends HookConsumerWidget {
.map((e) => e.toAlbum()) .map((e) => e.toAlbum())
.toList() ?? .toList() ??
[], [],
[query.value], [query.asData?.value],
); );
return HorizontalPlaybuttonCardView( return HorizontalPlaybuttonCardView(