mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
opt: view invalid user space
Closes #414 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +254,12 @@ class _MediaPageState extends State<MediaPage>
|
||||
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();
|
||||
|
||||
@@ -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<MemberControllerNew>(tag: heroTag);
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
dynamic response = (_ctr.loadingState.value as Success).response;
|
||||
if (response is space.Data) {
|
||||
currentPage = 2;
|
||||
dynamic res = (_ctr.loadingState.value as Success).response.season;
|
||||
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 ??= <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);
|
||||
|
||||
@@ -55,20 +55,12 @@ class _MemberFavoriteState extends State<MemberFavorite>
|
||||
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(
|
||||
|
||||
@@ -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<Tab> tabs;
|
||||
late List<Tab> tabs;
|
||||
List<Tab2>? 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<LoadingState> customGetData() => MemberHttp.space(mid: mid);
|
||||
|
||||
|
||||
@@ -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<MemberPageNew>
|
||||
padding: EdgeInsets.only(top: _userController.top ?? 0),
|
||||
child: const BackButton(),
|
||||
),
|
||||
title: Obx(() => _userController.scrollRatio.value == 1 &&
|
||||
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,7 +315,8 @@ class _MemberPageNewState extends State<MemberPageNew>
|
||||
Widget _buildUserInfo(LoadingState userState, [bool isV = true]) {
|
||||
return switch (userState) {
|
||||
Loading() => const CircularProgressIndicator(),
|
||||
Success() => Obx(
|
||||
Success() => userState.response is Data
|
||||
? Obx(
|
||||
() => Padding(
|
||||
padding: EdgeInsets.only(
|
||||
bottom: (_userController.tab2?.length ?? 0) > 1 ? 48 : 0),
|
||||
@@ -329,6 +333,11 @@ class _MemberPageNewState extends State<MemberPageNew>
|
||||
endTime: _userController.endTime,
|
||||
),
|
||||
),
|
||||
)
|
||||
: GestureDetector(
|
||||
onTap: _userController.onReload,
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: SizedBox(height: 56, width: double.infinity),
|
||||
),
|
||||
Error() => _errorWidget(userState.errMsg),
|
||||
LoadingState() => throw UnimplementedError(),
|
||||
|
||||
@@ -83,7 +83,10 @@ class _MemberSearchPageState extends State<MemberSearchPage> {
|
||||
heightFactor: 0.5,
|
||||
widthFactor: 1.0,
|
||||
child: Center(
|
||||
child: Text('搜索「${_memberSearchCtr.uname.value}」的动态、视频'),
|
||||
child: Text(
|
||||
'搜索「${_memberSearchCtr.uname.value}」的动态、视频',
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user