refa: query data (#659)

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
dom
2025-04-10 21:43:01 +08:00
committed by GitHub
parent 99b19e7b03
commit e1b73f4766
128 changed files with 1493 additions and 1987 deletions

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/space_article/item.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/content/article/member_article_ctr.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/content/article/widget/item.dart';
import 'package:PiliPlus/utils/grid.dart';
@@ -38,10 +39,10 @@ class _MemberArticleState extends State<MemberArticle>
return Obx(() => _buildBody(_controller.loadingState.value));
}
_buildBody(LoadingState loadingState) {
_buildBody(LoadingState<List<Item>?> loadingState) {
return switch (loadingState) {
Loading() => loadingWidget,
Success() => (loadingState.response as List?)?.isNotEmpty == true
Success() => loadingState.response?.isNotEmpty == true
? refreshIndicator(
onRefresh: () async {
await _controller.onRefresh();
@@ -56,14 +57,14 @@ class _MemberArticleState extends State<MemberArticle>
),
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.length - 1) {
if (index == loadingState.response!.length - 1) {
_controller.onLoadMore();
}
return MemberArticleItem(
item: loadingState.response[index],
item: loadingState.response![index],
);
},
childCount: loadingState.response.length,
childCount: loadingState.response!.length,
),
),
],

View File

@@ -2,10 +2,9 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/space_article/item.dart';
import 'package:PiliPlus/models/space_article/data.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
class MemberArticleCtr extends CommonController {
class MemberArticleCtr extends CommonListController<Data, Item> {
MemberArticleCtr({
required this.mid,
});
@@ -21,24 +20,24 @@ class MemberArticleCtr extends CommonController {
}
@override
bool customHandleResponse(Success response) {
Data data = response.response;
if (data.item.isNullOrEmpty) {
isEnd = true;
}
count = data.count ?? -1;
if (currentPage != 1 && loadingState.value is Success) {
data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response);
}
if ((data.item?.length ?? -1) >= count) {
isEnd = true;
}
loadingState.value = LoadingState.success(data.item);
return true;
List<Item>? getDataList(Data response) {
return response.item;
}
@override
Future<LoadingState> customGetData() =>
void checkIsEnd(int length) {
if (length >= count) {
isEnd = true;
}
}
@override
bool customHandleResponse(bool isRefresh, Success<Data> response) {
count = response.response.count ?? -1;
return false;
}
@override
Future<LoadingState<Data>> customGetData() =>
MemberHttp.spaceArticle(mid: mid, page: currentPage);
}

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/bangumi/widgets/bangumi_card_v_member_home.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/content/bangumi/member_bangumi_ctr.dart';
import 'package:PiliPlus/utils/grid.dart';
@@ -41,10 +42,10 @@ class _MemberBangumiState extends State<MemberBangumi>
return Obx(() => _buildBody(_controller.loadingState.value));
}
_buildBody(LoadingState loadingState) {
_buildBody(LoadingState<List<Item>?> loadingState) {
return switch (loadingState) {
Loading() => loadingWidget,
Success() => (loadingState.response as List?)?.isNotEmpty == true
Success() => loadingState.response?.isNotEmpty == true
? refreshIndicator(
onRefresh: () async {
await _controller.onRefresh();
@@ -70,14 +71,14 @@ class _MemberBangumiState extends State<MemberBangumi>
),
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.length - 1) {
if (index == loadingState.response!.length - 1) {
_controller.onLoadMore();
}
return BangumiCardVMemberHome(
bangumiItem: loadingState.response[index],
bangumiItem: loadingState.response![index],
);
},
childCount: loadingState.response.length,
childCount: loadingState.response!.length,
),
),
),

View File

@@ -2,15 +2,14 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
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 {
class MemberBangumiCtr extends CommonListController<Data, Item> {
MemberBangumiCtr({
required this.mid,
required this.heroTag,
@@ -37,24 +36,19 @@ class MemberBangumiCtr extends CommonController {
}
@override
bool customHandleResponse(Success response) {
Data data = response.response;
if (data.item.isNullOrEmpty) {
isEnd = true;
}
if (currentPage != 1 && loadingState.value is Success) {
data.item ??= <Item>[];
data.item!.insertAll(0, (loadingState.value as Success).response);
}
if (isEnd.not && count != null && data.item!.length >= count!) {
isEnd = true;
}
loadingState.value = LoadingState.success(data.item);
return true;
List<Item>? getDataList(Data response) {
return response.item;
}
@override
Future<LoadingState> customGetData() => MemberHttp.spaceArchive(
void checkIsEnd(int length) {
if (count != null && length >= count!) {
isEnd = true;
}
}
@override
Future<LoadingState<Data>> customGetData() => MemberHttp.spaceArchive(
type: ContributeType.bangumi,
mid: mid,
pn: currentPage,

View File

@@ -4,12 +4,12 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/space_fav/datum.dart';
import 'package:PiliPlus/models/space_fav/list.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/common/common_data_controller.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class MemberFavoriteCtr extends CommonController {
class MemberFavoriteCtr extends CommonDataController {
MemberFavoriteCtr({
required this.mid,
});
@@ -39,7 +39,7 @@ class MemberFavoriteCtr extends CommonController {
}
@override
bool customHandleResponse(Success response) {
bool customHandleResponse(bool isRefresh, Success response) {
try {
List<Datum> res = response.response;
first.value = res.first;

View File

@@ -1,10 +1,11 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
class SeasonSeriesController extends CommonController {
class SeasonSeriesController extends CommonListController {
SeasonSeriesController(this.mid);
final int mid;
int? count;
@override
void onInit() {
@@ -13,16 +14,22 @@ class SeasonSeriesController extends CommonController {
}
@override
bool customHandleResponse(Success response) {
Map data = response.response;
List list = ((data['seasons_list'] as List?) ?? []) +
((data['series_list'] as List?) ?? []);
if (currentPage != 0 && loadingState.value is Success) {
list.insertAll(0, (loadingState.value as Success).response);
List? getDataList(response) {
return ((response['seasons_list'] as List?) ?? []) +
((response['series_list'] as List?) ?? []);
}
@override
void checkIsEnd(int length) {
if (count != null && length >= count!) {
isEnd = true;
}
isEnd = list.length >= ((data['page']['total'] as int?) ?? 0);
loadingState.value = LoadingState.success(list);
return true;
}
@override
bool customHandleResponse(bool isRefresh, Success response) {
count = response.response['page']?['total'];
return false;
}
@override

View File

@@ -39,10 +39,10 @@ class _SeasonSeriesPageState extends State<SeasonSeriesPage>
return Obx(() => _buildBody(_controller.loadingState.value));
}
Widget _buildBody(LoadingState loadingState) {
Widget _buildBody(LoadingState<List<dynamic>?> loadingState) {
return switch (loadingState) {
Loading() => loadingWidget,
Success() => (loadingState.response as List?)?.isNotEmpty == true
Success() => loadingState.response?.isNotEmpty == true
? CustomScrollView(
slivers: [
SliverPadding(
@@ -58,13 +58,13 @@ class _SeasonSeriesPageState extends State<SeasonSeriesPage>
),
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.length - 1) {
if (index == loadingState.response!.length - 1) {
_controller.onLoadMore();
}
dynamic item = loadingState.response![index];
return SeasonSeriesCard(
item: loadingState.response[index],
item: item,
onTap: () {
dynamic item = loadingState.response[index];
bool isSeason = item['meta']['season_id'] != null;
dynamic id = isSeason
? item['meta']['season_id']
@@ -89,7 +89,7 @@ class _SeasonSeriesPageState extends State<SeasonSeriesPage>
},
);
},
childCount: loadingState.response.length,
childCount: loadingState.response!.length,
),
),
),

View File

@@ -60,10 +60,10 @@ class _MemberVideoState extends State<MemberVideo>
return Obx(() => _buildBody(_controller.loadingState.value));
}
_buildBody(LoadingState loadingState) {
_buildBody(LoadingState<List<Item>?> loadingState) {
return switch (loadingState) {
Loading() => loadingWidget,
Success() => (loadingState.response as List?)?.isNotEmpty == true
Success() => loadingState.response?.isNotEmpty == true
? Stack(
clipBehavior: Clip.none,
children: [
@@ -186,17 +186,17 @@ class _MemberVideoState extends State<MemberVideo>
delegate: SliverChildBuilderDelegate(
(context, index) {
if (widget.type != ContributeType.season &&
index == loadingState.response.length - 1) {
index == loadingState.response!.length - 1) {
_controller.onLoadMore();
}
final Item item = loadingState.response[index];
final Item item = loadingState.response![index];
return VideoCardHMemberVideo(
key: ValueKey('${item.param}'),
videoItem: item,
fromViewAid: _controller.fromViewAid,
);
},
childCount: loadingState.response.length,
childCount: loadingState.response!.length,
),
),
),

View File

@@ -4,7 +4,7 @@ import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/episodic_button.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
import 'package:PiliPlus/utils/extension.dart';
@@ -13,7 +13,7 @@ import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class MemberVideoCtr extends CommonController {
class MemberVideoCtr extends CommonListController<Data, Item> {
MemberVideoCtr({
required this.type,
required this.mid,
@@ -70,7 +70,7 @@ class MemberVideoCtr extends CommonController {
}
@override
bool customHandleResponse(Success response) {
bool customHandleResponse(bool isRefresh, Success<Data> response) {
Data data = response.response;
episodicButton.value = data.episodicButton ?? EpisodicButton();
episodicButton.refresh();
@@ -105,7 +105,7 @@ class MemberVideoCtr extends CommonController {
}
@override
Future<LoadingState> customGetData() => MemberHttp.spaceArchive(
Future<LoadingState<Data>> customGetData() => MemberHttp.spaceArchive(
type: type,
mid: mid,
aid: type == ContributeType.video

View File

@@ -2,7 +2,7 @@ import 'dart:math';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/space/tab2.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/common/common_data_controller.dart';
import 'package:PiliPlus/pages/member/new/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter/material.dart';
@@ -10,7 +10,7 @@ import 'package:get/get.dart';
import '../../../../../models/space/item.dart';
class MemberContributeCtr extends CommonController
class MemberContributeCtr extends CommonDataController
with GetTickerProviderStateMixin {
MemberContributeCtr({
required this.heroTag,

View File

@@ -1,67 +0,0 @@
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel_grpc.dart';
import 'package:PiliPlus/pages/member/new/content/member_dynamic/member_dynamic_ctr.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@Deprecated('Use MemberDynamicsPage instead')
class MemberDynamic extends StatefulWidget {
const MemberDynamic({
super.key,
required this.mid,
});
final int mid;
@override
State<MemberDynamic> createState() => _MemberDynamicState();
}
class _MemberDynamicState extends State<MemberDynamic>
with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
late final _controller = Get.put(MemberDynamicCtr(mid: widget.mid));
@override
Widget build(BuildContext context) {
super.build(context);
return Obx(() => _buildBody(_controller.loadingState.value));
}
_buildBody(LoadingState loadingState) {
return switch (loadingState) {
Loading() => loadingWidget,
Success() => (loadingState.response as List?)?.isNotEmpty == true
? refreshIndicator(
onRefresh: () async {
await _controller.onRefresh();
},
child: ListView.separated(
itemCount: loadingState.response.length,
itemBuilder: (context, index) {
if (index == loadingState.response.length - 1) {
_controller.onLoadMore();
}
return DynamicPanelGrpc(
item: loadingState.response[index],
);
},
separatorBuilder: (context, index) =>
const SizedBox(height: 10),
),
)
: scrollErrorWidget(
callback: _controller.onReload,
),
Error() => scrollErrorWidget(
errMsg: loadingState.errMsg,
callback: _controller.onReload,
),
LoadingState() => throw UnimplementedError(),
};
}
}

View File

@@ -1,28 +0,0 @@
import 'package:PiliPlus/grpc/app/dynamic/v2/dynamic.pb.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
class MemberDynamicCtr extends CommonController {
MemberDynamicCtr({
required this.mid,
});
int mid;
@override
bool customHandleResponse(Success response) {
DynSpaceRsp res = response.response;
isEnd = !res.hasMore;
if (currentPage != 1 && loadingState.value is Success) {
res.list.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(res.list);
return true;
}
@override
Future<LoadingState> customGetData() => MemberHttp.spaceDynamic(
mid: mid,
page: currentPage,
);
}

View File

@@ -6,7 +6,7 @@ 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/pages/common/common_data_controller.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
@@ -20,7 +20,7 @@ extension MemberTabTypeExt on MemberTabType {
String get title => ['默认', '首页', '动态', '投稿', '收藏', '番剧'][index];
}
class MemberControllerNew extends CommonController
class MemberControllerNew extends CommonDataController<Data, dynamic>
with GetTickerProviderStateMixin {
MemberControllerNew({required this.mid});
int mid;
@@ -58,7 +58,7 @@ class MemberControllerNew extends CommonController
];
@override
bool customHandleResponse(Success response) {
bool customHandleResponse(bool isRefresh, Success<Data> response) {
Data data = response.response;
username = data.card?.name ?? '';
isFollow.value = data.card?.relation?.isFollow == 1;
@@ -138,7 +138,7 @@ class MemberControllerNew extends CommonController
}
@override
Future<LoadingState> customGetData() => MemberHttp.space(
Future<LoadingState<Data>> customGetData() => MemberHttp.space(
mid: mid,
fromViewAid: fromViewAid,
);

View File

@@ -24,8 +24,7 @@ class MemberPageNew extends StatefulWidget {
State<MemberPageNew> createState() => _MemberPageNewState();
}
class _MemberPageNewState extends State<MemberPageNew>
with TickerProviderStateMixin {
class _MemberPageNewState extends State<MemberPageNew> {
late final int _mid;
late final String _heroTag;
late final MemberControllerNew _userController;