diff --git a/lib/http/user.dart b/lib/http/user.dart index 57525c2d..40d5653f 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -43,7 +43,7 @@ class UserHttp { } // 收藏夹 - static Future userfavFolderNew({ + static Future userfavFolder({ required int pn, required int ps, required int mid, @@ -64,31 +64,6 @@ class UserHttp { } } - static Future userfavFolder({ - required int pn, - required int ps, - required int mid, - }) async { - var res = await Request().get(Api.userFavFolder, data: { - 'pn': pn, - 'ps': ps, - 'up_mid': mid, - }); - if (res.data['code'] == 0) { - 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': res.data['message'] ?? '账号未登录' - }; - } - } - static Future userFavFolderDetail( {required int mediaId, required int pn, diff --git a/lib/pages/fav/controller.dart b/lib/pages/fav/controller.dart index 7b4e6ed1..2df04cb4 100644 --- a/lib/pages/fav/controller.dart +++ b/lib/pages/fav/controller.dart @@ -42,7 +42,7 @@ class FavController extends CommonController { } @override - Future customGetData() => UserHttp.userfavFolderNew( + Future customGetData() => UserHttp.userfavFolder( pn: currentPage, ps: pageSize, mid: userInfo!.mid!, diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index f13b9aba..e5ea3c2f 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -91,7 +91,7 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { } if (currentPage is MediaPage) { - _mediaController.queryFavFolder(); + _mediaController.queryData(); } } diff --git a/lib/pages/media/controller.dart b/lib/pages/media/controller.dart index eff4f825..ec515023 100644 --- a/lib/pages/media/controller.dart +++ b/lib/pages/media/controller.dart @@ -1,13 +1,13 @@ +import 'package:PiliPalaX/http/loading_state.dart'; +import 'package:PiliPalaX/pages/common/common_controller.dart'; 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:PiliPalaX/http/user.dart'; -import 'package:PiliPalaX/models/user/fav_folder.dart'; import 'package:PiliPalaX/utils/storage.dart'; -class MediaController extends GetxController { - Rx favFolderData = FavFolderData().obs; +class MediaController extends CommonController { Box userInfoCache = GStorage.userInfo; RxBool userLogin = false.obs; List list = [ @@ -45,25 +45,32 @@ class MediaController extends GetxController { ]; dynamic userInfo; int? mid; - final ScrollController scrollController = ScrollController(); + RxInt count = (-1).obs; @override void onInit() { super.onInit(); userInfo = userInfoCache.get('userInfoCache'); userLogin.value = userInfo != null; + + if (userLogin.value) { + queryData(); + } } - Future queryFavFolder() async { - if (!userLogin.value) { - return {'status': false, 'data': [], 'msg': '未登录'}; + @override + bool customHandleResponse(Success response) { + if (currentPage == 1) { + count.value = response.response.count; } - var res = await await UserHttp.userfavFolder( - pn: 1, - ps: 5, - mid: mid ?? GStorage.userInfo.get('userInfoCache').mid, - ); - favFolderData.value = res['data']; - return res; + loadingState.value = response; + return true; } + + @override + Future customGetData() => UserHttp.userfavFolder( + pn: 1, + ps: 5, + mid: mid ?? GStorage.userInfo.get('userInfoCache').mid, + ); } diff --git a/lib/pages/media/view.dart b/lib/pages/media/view.dart index 0cb02d83..b940e4b0 100644 --- a/lib/pages/media/view.dart +++ b/lib/pages/media/view.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:PiliPalaX/http/loading_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; @@ -20,7 +21,6 @@ class MediaPage extends StatefulWidget { class _MediaPageState extends State with AutomaticKeepAliveClientMixin { late MediaController mediaController; - late Future _futureBuilderFuture; @override bool get wantKeepAlive => true; @@ -29,20 +29,16 @@ class _MediaPageState extends State void initState() { super.initState(); mediaController = Get.put(MediaController()); - _futureBuilderFuture = mediaController.queryFavFolder(); - ScrollController scrollController = mediaController.scrollController; StreamController mainStream = Get.find().bottomBarStream; mediaController.userLogin.listen((status) { - setState(() { - _futureBuilderFuture = mediaController.queryFavFolder(); - }); + mediaController.onReload(); }); - scrollController.addListener( + mediaController.scrollController.addListener( () { final ScrollDirection direction = - scrollController.position.userScrollDirection; + mediaController.scrollController.position.userScrollDirection; if (direction == ScrollDirection.forward) { mainStream.add(true); } else if (direction == ScrollDirection.reverse) { @@ -55,7 +51,6 @@ class _MediaPageState extends State @override void dispose() { mediaController.scrollController.removeListener(() {}); - mediaController.scrollController.dispose(); super.dispose(); } @@ -155,9 +150,9 @@ class _MediaPageState extends State Theme.of(context).textTheme.titleMedium!.fontSize, fontWeight: FontWeight.bold), ), - if (mediaController.favFolderData.value.count != null) + if (mediaController.count.value != -1) TextSpan( - text: "${mediaController.favFolderData.value.count} ", + text: "${mediaController.count.value} ", style: TextStyle( fontSize: Theme.of(context).textTheme.titleSmall!.fontSize, @@ -177,11 +172,7 @@ class _MediaPageState extends State ), trailing: IconButton( tooltip: '刷新', - onPressed: () { - setState(() { - _futureBuilderFuture = mediaController.queryFavFolder(); - }); - }, + onPressed: mediaController.onReload, icon: const Icon( Icons.refresh, size: 20, @@ -192,78 +183,62 @@ class _MediaPageState extends State SizedBox( width: double.infinity, height: MediaQuery.textScalerOf(context).scale(200), - child: FutureBuilder( - future: _futureBuilderFuture, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.data == null) { - return const SizedBox(); - } - Map data = snapshot.data as Map; - if (data['status']) { - List favFolderList = - mediaController.favFolderData.value.list!; - int favFolderCount = - mediaController.favFolderData.value.count!; - bool flag = favFolderCount > favFolderList.length; - return Obx(() => ListView.builder( - itemCount: - mediaController.favFolderData.value.list!.length + - (flag ? 1 : 0), - itemBuilder: (context, index) { - if (flag && index == favFolderList.length) { - return Padding( - padding: const EdgeInsets.only( - right: 14, bottom: 35), - child: Center( - child: IconButton( - tooltip: '查看更多', - style: ButtonStyle( - padding: MaterialStateProperty.all( - EdgeInsets.zero), - backgroundColor: - MaterialStateProperty.resolveWith( - (states) { - return Theme.of(context) - .colorScheme - .primaryContainer - .withOpacity(0.5); - }), - ), - onPressed: () => Get.toNamed('/fav'), - icon: Icon( - Icons.arrow_forward_ios, - size: 18, - color: Theme.of(context) - .colorScheme - .primary, - ), - ), - )); - } else { - return FavFolderItem( - item: mediaController - .favFolderData.value.list![index], - index: index); - } - }, - scrollDirection: Axis.horizontal, - )); - } else { - return SizedBox( - height: 160, - child: Center(child: Text(data['msg'])), - ); - } - } else { - // 骨架屏 - return const SizedBox(); - } - }), + child: Obx(() => _buildBody(mediaController.loadingState.value)), ), ], ); } + + Widget _buildBody(LoadingState loadingState) { + if (loadingState is Success) { + List favFolderList = loadingState.response.list; + int favFolderCount = loadingState.response.count; + bool flag = favFolderCount > favFolderList.length; + return ListView.builder( + itemCount: loadingState.response.list.length + (flag ? 1 : 0), + itemBuilder: (context, index) { + if (flag && index == favFolderList.length) { + return Padding( + padding: const EdgeInsets.only(right: 14, bottom: 35), + child: Center( + child: IconButton( + tooltip: '查看更多', + style: ButtonStyle( + padding: WidgetStateProperty.all(EdgeInsets.zero), + backgroundColor: WidgetStateProperty.resolveWith((states) { + return Theme.of(context) + .colorScheme + .primaryContainer + .withOpacity(0.5); + }), + ), + onPressed: () => Get.toNamed('/fav'), + icon: Icon( + Icons.arrow_forward_ios, + size: 18, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + ); + } else { + return FavFolderItem( + item: loadingState.response.list[index], + index: index, + ); + } + }, + scrollDirection: Axis.horizontal, + ); + } + if (loadingState is Error) { + return SizedBox( + height: 160, + child: Center(child: Text(loadingState.errMsg)), + ); + } + return const SizedBox(); + } } class FavFolderItem extends StatelessWidget {