Improve aggregated search ui.

This commit is contained in:
2025-03-17 18:51:27 +08:00
parent 00cdc18ddd
commit 533497ead1
3 changed files with 46 additions and 19 deletions

View File

@@ -1196,7 +1196,6 @@ class ComicListState extends State<ComicList> {
if (res.subData == null) { if (res.subData == null) {
_maxPage = _data.length; _maxPage = _data.length;
} else { } else {
print("next page: ${_data.length}");
_nextUrl = res.subData; _nextUrl = res.subData;
} }
} }
@@ -1621,17 +1620,20 @@ class _SMClipper extends CustomClipper<Rect> {
} }
class SimpleComicTile extends StatelessWidget { class SimpleComicTile extends StatelessWidget {
const SimpleComicTile({super.key, required this.comic, this.onTap}); const SimpleComicTile(
{super.key, required this.comic, this.onTap, this.withTitle = false});
final Comic comic; final Comic comic;
final void Function()? onTap; final void Function()? onTap;
final bool withTitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var image = _findImageProvider(comic); var image = _findImageProvider(comic);
var child = image == null Widget child = image == null
? const SizedBox() ? const SizedBox()
: AnimatedImage( : AnimatedImage(
image: image, image: image,
@@ -1641,7 +1643,18 @@ class SimpleComicTile extends StatelessWidget {
filterQuality: FilterQuality.medium, filterQuality: FilterQuality.medium,
); );
return AnimatedTapRegion( child = Container(
width: 98,
height: 136,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.secondaryContainer,
),
clipBehavior: Clip.antiAlias,
child: child,
);
child = AnimatedTapRegion(
borderRadius: 8, borderRadius: 8,
onTap: onTap ?? onTap: onTap ??
() { () {
@@ -1652,16 +1665,29 @@ class SimpleComicTile extends StatelessWidget {
), ),
); );
}, },
child: Container(
width: 92,
height: 114,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.secondaryContainer,
),
clipBehavior: Clip.antiAlias,
child: child, child: child,
);
if (withTitle) {
child = Column(
mainAxisSize: MainAxisSize.min,
children: [
child,
const SizedBox(height: 4),
SizedBox(
width: 92,
child: Center(
child: Text(
comic.title.replaceAll('\n', ''),
maxLines: 1,
overflow: TextOverflow.ellipsis,
), ),
),
),
],
); );
} }
return child;
}
} }

View File

@@ -90,7 +90,7 @@ class _SliverSearchResultState extends State<_SliverSearchResult>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
bool isLoading = true; bool isLoading = true;
static const _kComicHeight = 132.0; static const _kComicHeight = 162.0;
get _comicWidth => _kComicHeight * 0.7; get _comicWidth => _kComicHeight * 0.7;
@@ -152,7 +152,7 @@ class _SliverSearchResultState extends State<_SliverSearchResult>
} }
Widget buildComic(Comic c) { Widget buildComic(Comic c) {
return SimpleComicTile(comic: c) return SimpleComicTile(comic: c, withTitle: true)
.paddingLeft(_kLeftPadding) .paddingLeft(_kLeftPadding)
.paddingBottom(2); .paddingBottom(2);
} }

View File

@@ -297,7 +297,7 @@ class _HistoryState extends State<_History> {
).paddingHorizontal(16), ).paddingHorizontal(16),
if (history.isNotEmpty) if (history.isNotEmpty)
SizedBox( SizedBox(
height: 128, height: 136,
child: ListView.builder( child: ListView.builder(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemCount: history.length, itemCount: history.length,
@@ -400,13 +400,14 @@ class _LocalState extends State<_Local> {
).paddingHorizontal(16), ).paddingHorizontal(16),
if (local.isNotEmpty) if (local.isNotEmpty)
SizedBox( SizedBox(
height: 128, height: 136,
child: ListView.builder( child: ListView.builder(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemCount: local.length, itemCount: local.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return SimpleComicTile(comic: local[index]) return SimpleComicTile(comic: local[index])
.paddingHorizontal(8); .paddingHorizontal(8)
.paddingVertical(2);
}, },
), ),
).paddingHorizontal(8), ).paddingHorizontal(8),