rebuild
This commit is contained in:
@ -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,
|
||||||
|
@ -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);
|
||||||
|
// },
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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
10
lib/models/gallery.dart
Normal 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});
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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());
|
|
||||||
|
16
lib/provider/rerender.dart
Normal file
16
lib/provider/rerender.dart
Normal 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());
|
@ -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",
|
||||||
));
|
));
|
||||||
|
@ -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:
|
||||||
|
Reference in New Issue
Block a user