diff --git a/lib/http/user.dart b/lib/http/user.dart index 26739b02..8fceea41 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -51,10 +51,17 @@ class UserHttp { 'up_mid': mid, }); if (res.data['code'] == 0) { - FavFolderData data = FavFolderData.fromJson(res.data['data']); - return {'status': true, 'data': data}; + late FavFolderData data; + if (res.data['data'] != null) { + data = FavFolderData.fromJson(res.data['data']); + return {'status': true, 'data': data}; + } } else { - return {'status': false, 'data': [], 'msg': '账号未登录'}; + return { + 'status': false, + 'data': [], + 'msg': res.data['message'] ?? '账号未登录' + }; } } diff --git a/lib/pages/fav/controller.dart b/lib/pages/fav/controller.dart index 41923449..c3f76186 100644 --- a/lib/pages/fav/controller.dart +++ b/lib/pages/fav/controller.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/http/user.dart'; @@ -6,23 +8,45 @@ import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/utils/storage.dart'; class FavController extends GetxController { + final ScrollController scrollController = ScrollController(); Rx favFolderData = FavFolderData().obs; Box userInfoCache = GStrorage.userInfo; UserInfoData? userInfo; + int currentPage = 1; + int pageSize = 10; + RxBool hasMore = true.obs; - Future queryFavFolder() async { + Future queryFavFolder({type = 'init'}) async { userInfo = userInfoCache.get('userInfoCache'); if (userInfo == null) { return {'status': false, 'msg': '账号未登录'}; } + if (!hasMore.value) { + return; + } var res = await await UserHttp.userfavFolder( - pn: 1, - ps: 10, + pn: currentPage, + ps: pageSize, mid: userInfo!.mid!, ); if (res['status']) { - favFolderData.value = res['data']; + if (type == 'init') { + favFolderData.value = res['data']; + } else { + if (res['data'].list.isNotEmpty) { + favFolderData.value.list!.addAll(res['data'].list); + favFolderData.update((val) {}); + } + } + hasMore.value = res['data'].hasMore; + currentPage++; + } else { + SmartDialog.showToast(res['msg']); } return res; } + + Future onLoad() async { + queryFavFolder(type: 'onload'); + } } diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index 8c242862..1196efc9 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -1,3 +1,4 @@ +import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/widgets/http_error.dart'; @@ -14,11 +15,23 @@ class FavPage extends StatefulWidget { class _FavPageState extends State { final FavController _favController = Get.put(FavController()); late Future _futureBuilderFuture; + late ScrollController scrollController; @override void initState() { super.initState(); _futureBuilderFuture = _favController.queryFavFolder(); + scrollController = _favController.scrollController; + scrollController.addListener( + () { + if (scrollController.position.pixels >= + scrollController.position.maxScrollExtent - 300) { + EasyThrottle.throttle('history', const Duration(seconds: 1), () { + _favController.onLoad(); + }); + } + }, + ); } @override @@ -40,6 +53,7 @@ class _FavPageState extends State { if (data['status']) { return Obx( () => ListView.builder( + controller: scrollController, itemCount: _favController.favFolderData.value.list!.length, itemBuilder: (context, index) { return FavItem(