From 2ce79d21b5ffb5aa955b40c7528047849ea5db76 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Mon, 10 Mar 2025 15:03:55 +0800 Subject: [PATCH] opt: view invalid user space Closes #414 Signed-off-by: bggRGjQaUbCoE --- lib/pages/common/common_controller.dart | 7 ++- lib/pages/media/view.dart | 7 ++- .../content/bangumi/member_bangumi_ctr.dart | 20 ++++--- .../content/favorite/member_favorite.dart | 12 +--- lib/pages/member/new/controller.dart | 26 ++++++++- lib/pages/member/new/member_page.dart | 57 +++++++++++-------- lib/pages/member_search/view.dart | 5 +- 7 files changed, 89 insertions(+), 45 deletions(-) diff --git a/lib/pages/common/common_controller.dart b/lib/pages/common/common_controller.dart index 03d7568e..183c98c9 100644 --- a/lib/pages/common/common_controller.dart +++ b/lib/pages/common/common_controller.dart @@ -21,6 +21,10 @@ abstract class CommonController extends GetxController { return false; } + bool handleError(String? errMsg) { + return false; + } + // void handleSuccess(List currentList, List dataList) {} Future queryData([bool isRefresh = true]) async { @@ -45,7 +49,8 @@ abstract class CommonController extends GetxController { } currentPage++; } else { - if (isRefresh) { + if (isRefresh && + handleError(response is Error ? response.errMsg : null).not) { loadingState.value = response; } } diff --git a/lib/pages/media/view.dart b/lib/pages/media/view.dart index a8872619..3ca45010 100644 --- a/lib/pages/media/view.dart +++ b/lib/pages/media/view.dart @@ -254,7 +254,12 @@ class _MediaPageState extends State if (loadingState is Error) { return SizedBox( height: 160, - child: Center(child: Text(loadingState.errMsg)), + child: Center( + child: Text( + loadingState.errMsg, + textAlign: TextAlign.center, + ), + ), ); } return const SizedBox(); diff --git a/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart b/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart index 9d7efe7c..c95b6782 100644 --- a/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart +++ b/lib/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart @@ -8,6 +8,7 @@ import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contr import 'package:PiliPlus/pages/member/new/controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:get/get.dart'; +import 'package:PiliPlus/models/space/data.dart' as space; class MemberBangumiCtr extends CommonController { MemberBangumiCtr({ @@ -17,17 +18,22 @@ class MemberBangumiCtr extends CommonController { final int mid; final String? heroTag; - late final int count; + int? count; late final _ctr = Get.find(tag: heroTag); @override void onInit() { super.onInit(); - currentPage = 2; - dynamic res = (_ctr.loadingState.value as Success).response.season; - loadingState.value = LoadingState.success(res.item); - count = res.count; - isEnd = res.item!.length >= count; + dynamic response = (_ctr.loadingState.value as Success).response; + if (response is space.Data) { + currentPage = 2; + dynamic res = response.season; + loadingState.value = LoadingState.success(res.item); + count = res.count; + isEnd = res.item!.length >= count; + } else { + queryData(); + } } @override @@ -40,7 +46,7 @@ class MemberBangumiCtr extends CommonController { data.item ??= []; data.item!.insertAll(0, (loadingState.value as Success).response); } - if (data.item!.length >= count) { + if (isEnd.not && count != null && data.item!.length >= count!) { isEnd = true; } loadingState.value = LoadingState.success(data.item); diff --git a/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart b/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart index 913fe93c..c9f13013 100644 --- a/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart +++ b/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart @@ -55,20 +55,12 @@ class _MemberFavoriteState extends State slivers: [ SliverToBoxAdapter( child: Obx( - () => _controller.first.value.mediaListResponse?.list - ?.isNotEmpty == - true - ? _buildItem(_controller.first.value, true) - : const SizedBox.shrink(), + () => _buildItem(_controller.first.value, true), ), ), SliverToBoxAdapter( child: Obx( - () => _controller.second.value.mediaListResponse?.list - ?.isNotEmpty == - true - ? _buildItem(_controller.second.value, false) - : const SizedBox.shrink(), + () => _buildItem(_controller.second.value, false), ), ), SliverToBoxAdapter( diff --git a/lib/pages/member/new/controller.dart b/lib/pages/member/new/controller.dart index 98b1cf84..737fbca9 100644 --- a/lib/pages/member/new/controller.dart +++ b/lib/pages/member/new/controller.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/space/data.dart'; +import 'package:PiliPlus/models/space/item.dart'; import 'package:PiliPlus/models/space/tab2.dart'; import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/utils/storage.dart'; @@ -29,7 +30,7 @@ class MemberControllerNew extends CommonController RxBool isFollow = false.obs; RxInt relation = 1.obs; TabController? tabController; - late final List tabs; + late List tabs; List? tab2; RxInt contributeInitialIndex = 0.obs; double? top; @@ -112,6 +113,29 @@ class MemberControllerNew extends CommonController return true; } + @override + bool handleError(String? errMsg) { + tab2 = [ + Tab2(title: '动态', param: 'dynamic'), + Tab2( + title: '投稿', + param: 'contribute', + items: [Item(title: '视频', param: 'video')], + ), + Tab2(title: '收藏', param: 'favorite'), + Tab2(title: '追番', param: 'bangumi'), + ]; + tabs = tab2!.map((item) => Tab(text: item.title)).toList(); + tabController = TabController( + vsync: this, + length: tabs.length, + ); + scrollRatio.value = 1; + username = errMsg; + loadingState.value = LoadingState.success(null); + return true; + } + @override Future customGetData() => MemberHttp.space(mid: mid); diff --git a/lib/pages/member/new/member_page.dart b/lib/pages/member/new/member_page.dart index 11448e16..3f67cc01 100644 --- a/lib/pages/member/new/member_page.dart +++ b/lib/pages/member/new/member_page.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:PiliPlus/common/widgets/dynamic_sliver_appbar.dart'; import 'package:PiliPlus/common/widgets/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models/space/data.dart'; import 'package:PiliPlus/pages/member/new/content/member_contribute/content/bangumi/member_bangumi.dart'; import 'package:PiliPlus/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart'; import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'; @@ -197,13 +198,15 @@ class _MemberPageNewState extends State padding: EdgeInsets.only(top: _userController.top ?? 0), child: const BackButton(), ), - title: Obx(() => _userController.scrollRatio.value == 1 && - _userController.username != null - ? Padding( - padding: EdgeInsets.only(top: _userController.top ?? 0), - child: Text(_userController.username!), - ) - : const SizedBox.shrink()), + title: IgnorePointer( + child: Obx(() => _userController.scrollRatio.value == 1 && + _userController.username != null + ? Padding( + padding: EdgeInsets.only(top: _userController.top ?? 0), + child: Text(_userController.username!), + ) + : const SizedBox.shrink()), + ), pinned: true, flexibleSpace: _buildUserInfo(_userController.loadingState.value, isV), @@ -312,24 +315,30 @@ class _MemberPageNewState extends State Widget _buildUserInfo(LoadingState userState, [bool isV = true]) { return switch (userState) { Loading() => const CircularProgressIndicator(), - Success() => Obx( - () => Padding( - padding: EdgeInsets.only( - bottom: (_userController.tab2?.length ?? 0) > 1 ? 48 : 0), - child: UserInfoCard( - isV: isV, - isOwner: _userController.mid == _userController.ownerMid, - relation: _userController.relation.value, - isFollow: _userController.isFollow.value, - card: userState.response.card, - images: userState.response.images, - onFollow: () => _userController.onFollow(context), - live: _userController.live, - silence: _userController.silence, - endTime: _userController.endTime, + Success() => userState.response is Data + ? Obx( + () => Padding( + padding: EdgeInsets.only( + bottom: (_userController.tab2?.length ?? 0) > 1 ? 48 : 0), + child: UserInfoCard( + isV: isV, + isOwner: _userController.mid == _userController.ownerMid, + relation: _userController.relation.value, + isFollow: _userController.isFollow.value, + card: userState.response.card, + images: userState.response.images, + onFollow: () => _userController.onFollow(context), + live: _userController.live, + silence: _userController.silence, + endTime: _userController.endTime, + ), + ), + ) + : GestureDetector( + onTap: _userController.onReload, + behavior: HitTestBehavior.opaque, + child: SizedBox(height: 56, width: double.infinity), ), - ), - ), Error() => _errorWidget(userState.errMsg), LoadingState() => throw UnimplementedError(), }; diff --git a/lib/pages/member_search/view.dart b/lib/pages/member_search/view.dart index d8b86d2f..ccf3f3f0 100644 --- a/lib/pages/member_search/view.dart +++ b/lib/pages/member_search/view.dart @@ -83,7 +83,10 @@ class _MemberSearchPageState extends State { heightFactor: 0.5, widthFactor: 1.0, child: Center( - child: Text('搜索「${_memberSearchCtr.uname.value}」的动态、视频'), + child: Text( + '搜索「${_memberSearchCtr.uname.value}」的动态、视频', + textAlign: TextAlign.center, + ), ), ), ),