This commit is contained in:
cxc
2023-02-10 17:33:51 +08:00
parent bd259d8303
commit 5f5f2554eb
10 changed files with 100 additions and 38 deletions

View File

@ -1,8 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
// import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:momo/material/router.dart'; import 'package:momo/material/router.dart';
import 'package:momo/provider/rerender.dart';
import 'package:momo/provider/token.dart'; import 'package:momo/provider/token.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -18,8 +17,9 @@ class MyMaterialApp extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
String? token = ref.watch(tokenProvider); String? token = ref.watch(tokenProvider);
UniqueKey uniqueKey = ref.watch(uniqueIdProvider);
MyMaterialRouterConfig myMaterialRouterConfig = MyMaterialRouterConfig myMaterialRouterConfig =
MyMaterialRouterConfig(token); MyMaterialRouterConfig(token,uniqueKey);
return MaterialApp.router( return MaterialApp.router(
routerConfig: myMaterialRouterConfig.router, routerConfig: myMaterialRouterConfig.router,

View File

@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:momo/models/image_list_resp.dart'; import 'package:momo/models/image_list_resp.dart';
import 'package:momo/models/image_resp.dart'; import 'package:momo/models/image_resp.dart';
import 'package:momo/provider/gallery.dart';
import 'package:momo/request/http_client.dart'; import 'package:momo/request/http_client.dart';
class Gallery extends ConsumerStatefulWidget { class Gallery extends ConsumerStatefulWidget {
@ -13,14 +14,20 @@ class Gallery extends ConsumerStatefulWidget {
} }
class _GalleryState extends ConsumerState<Gallery> { class _GalleryState extends ConsumerState<Gallery> {
late ScrollController _scrollController;
List<ImageResp> imageList = []; List<ImageResp> imageList = [];
int pageNum = 1; int pageNum = 1;
int pageSize = 10; int pageSize = 10;
bool hasMore = false; bool hasMore = true;
bool loading = true; bool loading = false;
Future<dynamic> loadImages() async { Future<dynamic> loadImages() async {
loading = true; loading = true;
if (!hasMore) {
loading = false;
return;
}
print(pageNum); print(pageNum);
var resp = await dio.get("/image/history", var resp = await dio.get("/image/history",
queryParameters: {"page": pageNum, "size": pageSize}); queryParameters: {"page": pageNum, "size": pageSize});
@ -38,8 +45,9 @@ class _GalleryState extends ConsumerState<Gallery> {
void resetState() { void resetState() {
imageList = []; imageList = [];
pageNum = 1; pageNum = 1;
hasMore = false; hasMore = true;
loading = true; loading = false;
ref.read(galleryProvider.notifier).clearImage();
} }
@override @override
@ -47,26 +55,30 @@ class _GalleryState extends ConsumerState<Gallery> {
// TODO: implement initState // TODO: implement initState
super.initState(); super.initState();
print("init"); print("init");
// resetState(); // ref.read(galleryProvider.notifier).clearImage();
_scrollController = ScrollController(initialScrollOffset: 5.0)
..addListener(() {
if (_scrollController.offset >=
_scrollController.position.maxScrollExtent &&
!_scrollController.position.outOfRange) {
print("到底了 controller $loading");
if (!loading) {
loadImages();
}
}
});
loadImages(); loadImages();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print("build"); print("build gallery");
return GridView.builder( return GridView.builder(
itemCount: imageList.length, itemCount: imageList.length,
controller: _scrollController,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: MediaQuery.of(context).size.width > 640 ? 5 : 3), crossAxisCount: MediaQuery.of(context).size.width > 640 ? 5 : 3),
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
if (index == imageList.length - 1 && imageList.length < 200) {
if (hasMore && pageNum != 1 && !loading) {
loadImages();
} else {
print("没有了");
}
}
return InkWell( return InkWell(
onTap: () { onTap: () {
context.go(Uri( context.go(Uri(
@ -83,5 +95,28 @@ class _GalleryState extends ConsumerState<Gallery> {
), ),
); );
}); });
// final imageList = ref.watch(galleryProvider);
// return GridView.builder(
// itemCount: imageList.length,
// controller: _scrollController,
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
// crossAxisCount: MediaQuery.of(context).size.width > 640 ? 5 : 3),
// itemBuilder: (BuildContext context, int index) {
// 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);
// },
// ),
// );
// });
} }
} }

View File

@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:http_parser/http_parser.dart'; import 'package:http_parser/http_parser.dart';
import 'package:mime/mime.dart'; import 'package:mime/mime.dart';
import 'package:momo/provider/rerender.dart';
import 'package:momo/request/http_client.dart'; import 'package:momo/request/http_client.dart';
class HomePage extends ConsumerStatefulWidget { class HomePage extends ConsumerStatefulWidget {
@ -25,10 +26,6 @@ class _HomePageState extends ConsumerState<HomePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print(
widget.content.toString(),
);
print("123");
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
leading: ["/", "/profile"].contains(GoRouterState.of(context).location) leading: ["/", "/profile"].contains(GoRouterState.of(context).location)
@ -67,8 +64,7 @@ class _HomePageState extends ConsumerState<HomePage> {
mimeType.split("/").last)) mimeType.split("/").last))
}); });
await dio.post("/image/upload", data: data).then((value) { await dio.post("/image/upload", data: data).then((value) {
// widget.content.key = GlobalKey(); ref.read(uniqueIdProvider.notifier).updateId();
// widget.content
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Row( content: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,

View File

@ -8,10 +8,11 @@ import 'package:momo/material/profile.dart';
class MyMaterialRouterConfig { class MyMaterialRouterConfig {
late GoRouter router; late GoRouter router;
final GlobalKey<NavigatorState> _rootNavigatorKey = final GlobalKey<NavigatorState> _rootNavigatorKey =
GlobalKey<NavigatorState>(); GlobalKey<NavigatorState>();
MyMaterialRouterConfig(String? token) { MyMaterialRouterConfig(String? token, UniqueKey uniqueKey) {
router = GoRouter( router = GoRouter(
navigatorKey: _rootNavigatorKey, navigatorKey: _rootNavigatorKey,
initialLocation: "/", initialLocation: "/",

10
lib/models/gallery.dart Normal file
View File

@ -0,0 +1,10 @@
import 'image_resp.dart';
class Gallery {
int pageNum;
int pageSize;
List<ImageResp> imageList;
Gallery(
{required this.pageNum, required this.pageSize, required this.imageList});
}

View File

@ -1,10 +1,10 @@
import 'dart:ffi'; import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
part 'image_resp.g.dart'; part 'image_resp.g.dart';
@JsonSerializable() @JsonSerializable()
@immutable
class ImageResp { class ImageResp {
int id; int id;
String file_name; String file_name;

View File

@ -1,17 +1,21 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:momo/models/image_resp.dart';
class GalleryUpdateKeyNotifier extends Notifier<GlobalKey> { class GalleryNotifier extends Notifier<List<ImageResp>> {
@override @override
GlobalKey build() { List<ImageResp> build() {
return GlobalKey(); return [];
} }
void updateGallery() { void addImage({required List<ImageResp> imageList}) {
state = GlobalKey(); // return await rc.future;
state = [...state, ...imageList];
}
void clearImage() {
state = [];
} }
} }
final galleryUpdateKeyProvider = final galleryProvider =
NotifierProvider<GalleryUpdateKeyNotifier, GlobalKey>( NotifierProvider<GalleryNotifier, List<ImageResp>>(() => GalleryNotifier());
() => GalleryUpdateKeyNotifier());

View File

@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class UniqueIdNotifier extends Notifier<UniqueKey> {
@override
UniqueKey build() {
return UniqueKey();
}
void updateId() {
state = UniqueKey();
}
}
final uniqueIdProvider =
NotifierProvider<UniqueIdNotifier, UniqueKey>(() => UniqueIdNotifier());

View File

@ -1,5 +1,5 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
var dio = Dio(BaseOptions( var dio = Dio(BaseOptions(
baseUrl: "http://192.168.0.110:8080", baseUrl: "http://localhost:8080",
)); ));

View File

@ -353,10 +353,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: go_router name: go_router
sha256: "313e5899851b43de7e779c4a054e8d489fb61caf95fe786bc301b13120557f03" sha256: "5a0b2e0bc88a006c09d2b419004ffabecf83a74520b8852ea148f22e82634c27"
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
source: hosted source: hosted
version: "6.0.5" version: "6.0.6"
graphs: graphs:
dependency: transitive dependency: transitive
description: description: