active source switching and reactivity

This commit is contained in:
austinried
2025-11-22 11:33:40 +09:00
parent de9bc98044
commit 798a907cca
12 changed files with 271 additions and 774 deletions

View File

@@ -1,5 +1,5 @@
import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
@@ -23,15 +23,17 @@ class AlbumsGrid extends HookConsumerWidget {
final controller = usePagingController<int, Album>(
getNextPageKey: (state) =>
state.lastPageIsEmpty ? null : state.nextIntPageKey,
fetchPage: (pageKey) async {
final query = db.albums.select()
..where((f) => f.sourceId.equals(sourceId))
..limit(kPageSize, offset: (pageKey - 1) * kPageSize);
return await query.get();
},
fetchPage: (pageKey) => db.libraryDao.listAlbums(
limit: kPageSize,
offset: (pageKey - 1) * kPageSize,
),
);
useEffect(() {
controller.refresh();
return;
}, [sourceId]);
return PagingListener(
controller: controller,
builder: (context, state, fetchNextPage) {

View File

@@ -1,5 +1,5 @@
import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
@@ -25,36 +25,17 @@ class ArtistsList extends HookConsumerWidget {
final controller = usePagingController<int, _ArtistItem>(
getNextPageKey: (state) =>
state.lastPageIsEmpty ? null : state.nextIntPageKey,
fetchPage: (pageKey) async {
final albumCount = db.albums.id.count();
final query =
db.artists.select().join([
leftOuterJoin(
db.albums,
db.albums.artistId.equalsExp(db.artists.id),
),
])
..addColumns([albumCount])
..where(
db.artists.sourceId.equals(sourceId) &
db.albums.sourceId.equals(sourceId),
)
..groupBy([db.artists.sourceId, db.artists.id])
..orderBy([OrderingTerm.asc(db.artists.name)])
..limit(kPageSize, offset: (pageKey - 1) * kPageSize);
return (await query.get())
.map(
(row) => (
artist: row.readTable(db.artists),
albumCount: row.read(albumCount),
),
)
.toList();
},
fetchPage: (pageKey) => db.libraryDao.listArtists(
limit: kPageSize,
offset: (pageKey - 1) * kPageSize,
),
);
useEffect(() {
controller.refresh();
return;
}, [sourceId]);
return PagingListener(
controller: controller,
builder: (context, state, fetchNextPage) {