opt: view invalid user space

Closes #414

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-10 15:03:55 +08:00
parent b75fda3596
commit 2ce79d21b5
7 changed files with 89 additions and 45 deletions

View File

@@ -21,6 +21,10 @@ abstract class CommonController extends GetxController {
return false; return false;
} }
bool handleError(String? errMsg) {
return false;
}
// void handleSuccess(List currentList, List dataList) {} // void handleSuccess(List currentList, List dataList) {}
Future queryData([bool isRefresh = true]) async { Future queryData([bool isRefresh = true]) async {
@@ -45,7 +49,8 @@ abstract class CommonController extends GetxController {
} }
currentPage++; currentPage++;
} else { } else {
if (isRefresh) { if (isRefresh &&
handleError(response is Error ? response.errMsg : null).not) {
loadingState.value = response; loadingState.value = response;
} }
} }

View File

@@ -254,7 +254,12 @@ class _MediaPageState extends State<MediaPage>
if (loadingState is Error) { if (loadingState is Error) {
return SizedBox( return SizedBox(
height: 160, height: 160,
child: Center(child: Text(loadingState.errMsg)), child: Center(
child: Text(
loadingState.errMsg,
textAlign: TextAlign.center,
),
),
); );
} }
return const SizedBox(); return const SizedBox();

View File

@@ -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/pages/member/new/controller.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:PiliPlus/models/space/data.dart' as space;
class MemberBangumiCtr extends CommonController { class MemberBangumiCtr extends CommonController {
MemberBangumiCtr({ MemberBangumiCtr({
@@ -17,17 +18,22 @@ class MemberBangumiCtr extends CommonController {
final int mid; final int mid;
final String? heroTag; final String? heroTag;
late final int count; int? count;
late final _ctr = Get.find<MemberControllerNew>(tag: heroTag); late final _ctr = Get.find<MemberControllerNew>(tag: heroTag);
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
dynamic response = (_ctr.loadingState.value as Success).response;
if (response is space.Data) {
currentPage = 2; currentPage = 2;
dynamic res = (_ctr.loadingState.value as Success).response.season; dynamic res = response.season;
loadingState.value = LoadingState.success(res.item); loadingState.value = LoadingState.success(res.item);
count = res.count; count = res.count;
isEnd = res.item!.length >= count; isEnd = res.item!.length >= count;
} else {
queryData();
}
} }
@override @override
@@ -40,7 +46,7 @@ class MemberBangumiCtr extends CommonController {
data.item ??= <Item>[]; data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response); 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; isEnd = true;
} }
loadingState.value = LoadingState.success(data.item); loadingState.value = LoadingState.success(data.item);

View File

@@ -55,20 +55,12 @@ class _MemberFavoriteState extends State<MemberFavorite>
slivers: [ slivers: [
SliverToBoxAdapter( SliverToBoxAdapter(
child: Obx( child: Obx(
() => _controller.first.value.mediaListResponse?.list () => _buildItem(_controller.first.value, true),
?.isNotEmpty ==
true
? _buildItem(_controller.first.value, true)
: const SizedBox.shrink(),
), ),
), ),
SliverToBoxAdapter( SliverToBoxAdapter(
child: Obx( child: Obx(
() => _controller.second.value.mediaListResponse?.list () => _buildItem(_controller.second.value, false),
?.isNotEmpty ==
true
? _buildItem(_controller.second.value, false)
: const SizedBox.shrink(),
), ),
), ),
SliverToBoxAdapter( SliverToBoxAdapter(

View File

@@ -4,6 +4,7 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/space/data.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/models/space/tab2.dart';
import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
@@ -29,7 +30,7 @@ class MemberControllerNew extends CommonController
RxBool isFollow = false.obs; RxBool isFollow = false.obs;
RxInt relation = 1.obs; RxInt relation = 1.obs;
TabController? tabController; TabController? tabController;
late final List<Tab> tabs; late List<Tab> tabs;
List<Tab2>? tab2; List<Tab2>? tab2;
RxInt contributeInitialIndex = 0.obs; RxInt contributeInitialIndex = 0.obs;
double? top; double? top;
@@ -112,6 +113,29 @@ class MemberControllerNew extends CommonController
return true; 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 @override
Future<LoadingState> customGetData() => MemberHttp.space(mid: mid); Future<LoadingState> customGetData() => MemberHttp.space(mid: mid);

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/dynamic_sliver_appbar.dart'; import 'package:PiliPlus/common/widgets/dynamic_sliver_appbar.dart';
import 'package:PiliPlus/common/widgets/loading_widget.dart'; import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.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/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/content/favorite/member_favorite.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'; import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart';
@@ -197,13 +198,15 @@ class _MemberPageNewState extends State<MemberPageNew>
padding: EdgeInsets.only(top: _userController.top ?? 0), padding: EdgeInsets.only(top: _userController.top ?? 0),
child: const BackButton(), child: const BackButton(),
), ),
title: Obx(() => _userController.scrollRatio.value == 1 && title: IgnorePointer(
child: Obx(() => _userController.scrollRatio.value == 1 &&
_userController.username != null _userController.username != null
? Padding( ? Padding(
padding: EdgeInsets.only(top: _userController.top ?? 0), padding: EdgeInsets.only(top: _userController.top ?? 0),
child: Text(_userController.username!), child: Text(_userController.username!),
) )
: const SizedBox.shrink()), : const SizedBox.shrink()),
),
pinned: true, pinned: true,
flexibleSpace: flexibleSpace:
_buildUserInfo(_userController.loadingState.value, isV), _buildUserInfo(_userController.loadingState.value, isV),
@@ -312,7 +315,8 @@ class _MemberPageNewState extends State<MemberPageNew>
Widget _buildUserInfo(LoadingState userState, [bool isV = true]) { Widget _buildUserInfo(LoadingState userState, [bool isV = true]) {
return switch (userState) { return switch (userState) {
Loading() => const CircularProgressIndicator(), Loading() => const CircularProgressIndicator(),
Success() => Obx( Success() => userState.response is Data
? Obx(
() => Padding( () => Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
bottom: (_userController.tab2?.length ?? 0) > 1 ? 48 : 0), bottom: (_userController.tab2?.length ?? 0) > 1 ? 48 : 0),
@@ -329,6 +333,11 @@ class _MemberPageNewState extends State<MemberPageNew>
endTime: _userController.endTime, endTime: _userController.endTime,
), ),
), ),
)
: GestureDetector(
onTap: _userController.onReload,
behavior: HitTestBehavior.opaque,
child: SizedBox(height: 56, width: double.infinity),
), ),
Error() => _errorWidget(userState.errMsg), Error() => _errorWidget(userState.errMsg),
LoadingState() => throw UnimplementedError(), LoadingState() => throw UnimplementedError(),

View File

@@ -83,7 +83,10 @@ class _MemberSearchPageState extends State<MemberSearchPage> {
heightFactor: 0.5, heightFactor: 0.5,
widthFactor: 1.0, widthFactor: 1.0,
child: Center( child: Center(
child: Text('搜索「${_memberSearchCtr.uname.value}」的动态、视频'), child: Text(
'搜索「${_memberSearchCtr.uname.value}」的动态、视频',
textAlign: TextAlign.center,
),
), ),
), ),
), ),