import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:momo/models/image_list_resp.dart'; import 'package:momo/models/image_resp.dart'; import 'package:momo/request/http_client.dart'; class Gallery extends ConsumerStatefulWidget { const Gallery({Key? key}) : super(key: key); @override ConsumerState createState() => _GalleryState(); } class _GalleryState extends ConsumerState { List imageList = []; int pageNum = 1; int pageSize = 10; bool hasMore = false; bool loading = true; Future loadImages() async { loading = true; print(pageNum); var resp = await dio.get("/image/history", queryParameters: {"page": pageNum, "size": pageSize}); ImageListResp imageListResp = ImageListResp.fromJson(resp.data); hasMore = imageListResp.hasNext; pageNum = pageNum + 1; if (mounted) { setState(() { imageList.addAll(imageListResp.list); }); loading = false; } } void resetState() { imageList = []; pageNum = 1; hasMore = false; loading = true; } @override void initState() { // TODO: implement initState super.initState(); print("init"); // resetState(); loadImages(); } @override Widget build(BuildContext context) { return GridView.builder( // controller: , itemCount: imageList.length, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: MediaQuery.of(context).size.width > 640 ? 5 : 3), itemBuilder: (BuildContext context, int index) { if (index == imageList.length - 1 && imageList.length < 200) { if (hasMore && pageNum != 1 && !loading) { loadImages(); } else { print("没有了"); } } return InkWell( onTap: () { context.go(Uri( path: "/detail", queryParameters: {"id": "${imageList[index].id}"}) .toString()); }, child: Image.network( "${dio.options.baseUrl}/image/thumbnail/${imageList[index].file_path}", fit: BoxFit.cover, errorBuilder: (BuildContext context, o, err) { return const Icon(Icons.error_outline); }, ), ); }); } }