mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
refactor: member dynamic page
fix: DynamicsDataModel parsing error Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -350,8 +350,10 @@ class MemberHttp {
|
|||||||
'web_location': 1550101,
|
'web_location': 1550101,
|
||||||
'order_avoided': orderAvoided,
|
'order_avoided': orderAvoided,
|
||||||
'dm_img_list': '[]',
|
'dm_img_list': '[]',
|
||||||
'dm_img_str': dmImgStr.substring(0, dmImgStr.length - 2),
|
'dm_img_str': dmImgStr.substring(
|
||||||
'dm_cover_img_str': dmCoverImgStr.substring(0, dmCoverImgStr.length - 2),
|
0, (dmImgStr.length - 2).clamp(0, dmImgStr.length - 1)),
|
||||||
|
'dm_cover_img_str': dmCoverImgStr.substring(
|
||||||
|
0, (dmCoverImgStr.length - 2).clamp(0, dmCoverImgStr.length - 1)),
|
||||||
'dm_img_inter': '{"ds":[],"wh":[0,0,0],"of":[0,0,0]}',
|
'dm_img_inter': '{"ds":[],"wh":[0,0,0],"of":[0,0,0]}',
|
||||||
});
|
});
|
||||||
var res = await Request().get(
|
var res = await Request().get(
|
||||||
@@ -377,7 +379,7 @@ class MemberHttp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 用户动态
|
// 用户动态
|
||||||
static Future memberDynamic({String? offset, int? mid}) async {
|
static Future<LoadingState> memberDynamic({String? offset, int? mid}) async {
|
||||||
String dmImgStr = Utils.base64EncodeRandomString(16, 64);
|
String dmImgStr = Utils.base64EncodeRandomString(16, 64);
|
||||||
String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128);
|
String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128);
|
||||||
Map params = await WbiSign().makSign({
|
Map params = await WbiSign().makSign({
|
||||||
@@ -388,27 +390,23 @@ class MemberHttp {
|
|||||||
'platform': 'web',
|
'platform': 'web',
|
||||||
'web_location': '333.999',
|
'web_location': '333.999',
|
||||||
'dm_img_list': '[]',
|
'dm_img_list': '[]',
|
||||||
'dm_img_str': dmImgStr.substring(0, dmImgStr.length - 2),
|
'dm_img_str': dmImgStr.substring(
|
||||||
'dm_cover_img_str': dmCoverImgStr.substring(0, dmCoverImgStr.length - 2),
|
0, (dmImgStr.length - 2).clamp(0, dmImgStr.length - 1)),
|
||||||
|
'dm_cover_img_str': dmCoverImgStr.substring(
|
||||||
|
0, (dmCoverImgStr.length - 2).clamp(0, dmCoverImgStr.length - 1)),
|
||||||
'dm_img_inter': '{"ds":[],"wh":[0,0,0],"of":[0,0,0]}',
|
'dm_img_inter': '{"ds":[],"wh":[0,0,0],"of":[0,0,0]}',
|
||||||
'x-bili-device-req-json': jsonEncode({"platform": "web", "device": "pc"}),
|
'x-bili-device-req-json': jsonEncode({"platform": "web", "device": "pc"}),
|
||||||
'x-bili-web-req-json': jsonEncode({"spm_id": "333.999"}),
|
'x-bili-web-req-json': jsonEncode({"spm_id": "333.999"}),
|
||||||
});
|
});
|
||||||
var res = await Request().get(Api.memberDynamic, data: params);
|
var res = await Request().get(Api.memberDynamic, data: params);
|
||||||
if (res.data['code'] == 0) {
|
if (res.data['code'] == 0) {
|
||||||
return {
|
return LoadingState.success(DynamicsDataModel.fromJson(res.data['data']));
|
||||||
'status': true,
|
|
||||||
'data': DynamicsDataModel.fromJson(res.data['data']),
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
Map errMap = {
|
Map errMap = {
|
||||||
-352: '风控校验失败,请检查登录状态',
|
-352: '风控校验失败,请检查登录状态',
|
||||||
};
|
};
|
||||||
return {
|
return LoadingState.error(
|
||||||
'status': false,
|
errMap[res.data['code']] ?? res.data['message']);
|
||||||
'data': [],
|
|
||||||
'msg': errMap[res.data['code']] ?? res.data['message'],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class DynamicItemModel {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Map? basic;
|
Map? basic;
|
||||||
String? idStr;
|
dynamic idStr;
|
||||||
ItemModulesModel? modules;
|
ItemModulesModel? modules;
|
||||||
ItemOrigModel? orig;
|
ItemOrigModel? orig;
|
||||||
String? type;
|
String? type;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:PiliPalaX/http/loading_state.dart';
|
|||||||
import 'package:PiliPalaX/models/common/reply_type.dart';
|
import 'package:PiliPalaX/models/common/reply_type.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
import 'package:PiliPalaX/pages/video/detail/reply_new/reply_page.dart';
|
import 'package:PiliPalaX/pages/video/detail/reply_new/reply_page.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:easy_debounce/easy_throttle.dart';
|
import 'package:easy_debounce/easy_throttle.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -56,7 +57,7 @@ abstract class ReplyController extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (noMore.value == '没有更多了') return Future.value();
|
if (isRefresh.not && noMore.value == '没有更多了') return Future.value();
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:PiliPalaX/http/fan.dart';
|
import 'package:PiliPalaX/http/fan.dart';
|
||||||
import 'package:PiliPalaX/http/loading_state.dart';
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:PiliPalaX/utils/storage.dart';
|
import 'package:PiliPalaX/utils/storage.dart';
|
||||||
@@ -36,7 +37,7 @@ class FansController extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (isEnd) {
|
if (isRefresh.not && isEnd) {
|
||||||
return Future.value();
|
return Future.value();
|
||||||
}
|
}
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:PiliPalaX/http/loading_state.dart';
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:PiliPalaX/http/user.dart';
|
import 'package:PiliPalaX/http/user.dart';
|
||||||
import 'package:PiliPalaX/models/user/info.dart';
|
import 'package:PiliPalaX/models/user/info.dart';
|
||||||
@@ -23,7 +24,7 @@ class FavController extends CommonController {
|
|||||||
loadingState.value = LoadingState.error('账号未登录');
|
loadingState.value = LoadingState.error('账号未登录');
|
||||||
return Future.value();
|
return Future.value();
|
||||||
}
|
}
|
||||||
if (!hasMore) {
|
if (isRefresh.not && hasMore.not) {
|
||||||
return Future.value();
|
return Future.value();
|
||||||
}
|
}
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:PiliPalaX/http/loading_state.dart';
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:PiliPalaX/http/user.dart';
|
import 'package:PiliPalaX/http/user.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:PiliPalaX/utils/storage.dart';
|
import 'package:PiliPalaX/utils/storage.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -38,7 +39,7 @@ class FavDetailController extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (loadingText.value == '没有更多了') {
|
if (isRefresh.not && loadingText.value == '没有更多了') {
|
||||||
return Future.value();
|
return Future.value();
|
||||||
}
|
}
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:PiliPalaX/http/loading_state.dart';
|
|||||||
import 'package:PiliPalaX/http/member.dart';
|
import 'package:PiliPalaX/http/member.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
import 'package:PiliPalaX/pages/fav_search/view.dart' show SearchType;
|
import 'package:PiliPalaX/pages/fav_search/view.dart' show SearchType;
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -58,7 +59,7 @@ class FavSearchController extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (!hasMore) {
|
if (isRefresh.not && hasMore.not) {
|
||||||
return Future.value();
|
return Future.value();
|
||||||
}
|
}
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:PiliPalaX/http/loading_state.dart';
|
|||||||
import 'package:PiliPalaX/http/member.dart';
|
import 'package:PiliPalaX/http/member.dart';
|
||||||
import 'package:PiliPalaX/models/space_article/data.dart';
|
import 'package:PiliPalaX/models/space_article/data.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
|
|
||||||
class MemberArticleCtr extends CommonController {
|
class MemberArticleCtr extends CommonController {
|
||||||
MemberArticleCtr({
|
MemberArticleCtr({
|
||||||
@@ -27,7 +28,7 @@ class MemberArticleCtr extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (isEnd) return Future.value();
|
if (isRefresh.not && isEnd) return Future.value();
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPalaX/pages/common/common_controller.dart';
|
|||||||
import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart'
|
import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart'
|
||||||
show ContributeType;
|
show ContributeType;
|
||||||
import 'package:PiliPalaX/pages/member/new/controller.dart';
|
import 'package:PiliPalaX/pages/member/new/controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class MemberBangumiCtr extends CommonController {
|
class MemberBangumiCtr extends CommonController {
|
||||||
@@ -38,7 +39,7 @@ class MemberBangumiCtr extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (isEnd) return Future.value();
|
if (isRefresh.not && isEnd) return Future.value();
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:PiliPalaX/models/space_archive/data.dart';
|
|||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart'
|
import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart'
|
||||||
show ContributeType;
|
show ContributeType;
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class MemberVideoCtr extends CommonController {
|
class MemberVideoCtr extends CommonController {
|
||||||
@@ -43,7 +44,7 @@ class MemberVideoCtr extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (isEnd) return Future.value();
|
if (isRefresh.not && isEnd) return Future.value();
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:PiliPalaX/grpc/app/dynamic/v2/dynamic.pb.dart';
|
|||||||
import 'package:PiliPalaX/http/loading_state.dart';
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:PiliPalaX/http/member.dart';
|
import 'package:PiliPalaX/http/member.dart';
|
||||||
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
|
|
||||||
class MemberDynamicCtr extends CommonController {
|
class MemberDynamicCtr extends CommonController {
|
||||||
MemberDynamicCtr({
|
MemberDynamicCtr({
|
||||||
@@ -24,7 +25,7 @@ class MemberDynamicCtr extends CommonController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future queryData([bool isRefresh = true]) {
|
Future queryData([bool isRefresh = true]) {
|
||||||
if (isEnd) return Future.value();
|
if (isRefresh.not && isEnd) return Future.value();
|
||||||
return super.queryData(isRefresh);
|
return super.queryData(isRefresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ class _MemberPageNewState extends State<MemberPageNew>
|
|||||||
|
|
||||||
Widget get _buildBody => SafeArea(
|
Widget get _buildBody => SafeArea(
|
||||||
top: false,
|
top: false,
|
||||||
|
bottom: false,
|
||||||
child: TabBarView(
|
child: TabBarView(
|
||||||
controller: _userController.tabController,
|
controller: _userController.tabController,
|
||||||
children: _userController.tab2!.map((item) {
|
children: _userController.tab2!.map((item) {
|
||||||
|
|||||||
@@ -1,48 +1,51 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
|
import 'package:PiliPalaX/utils/extension.dart';
|
||||||
import 'package:PiliPalaX/http/member.dart';
|
import 'package:PiliPalaX/http/member.dart';
|
||||||
import 'package:PiliPalaX/models/dynamics/result.dart';
|
import 'package:PiliPalaX/models/dynamics/result.dart';
|
||||||
|
|
||||||
class MemberDynamicsController extends GetxController {
|
class MemberDynamicsController extends CommonController {
|
||||||
MemberDynamicsController(this.mid);
|
MemberDynamicsController(this.mid);
|
||||||
final ScrollController scrollController = ScrollController();
|
int mid;
|
||||||
int? mid;
|
|
||||||
String offset = '';
|
String offset = '';
|
||||||
int count = 0;
|
|
||||||
bool hasMore = true;
|
bool hasMore = true;
|
||||||
RxList<DynamicItemModel> dynamicsList = <DynamicItemModel>[].obs;
|
|
||||||
|
|
||||||
// TODO: refactor
|
|
||||||
late Future futureBuilderFuture;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() async {
|
void onInit() async {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
futureBuilderFuture = getMemberDynamic('onRefresh');
|
queryData();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future getMemberDynamic(type) async {
|
@override
|
||||||
if (type == 'onRefresh') {
|
Future onRefresh() {
|
||||||
offset = '';
|
offset = '';
|
||||||
dynamicsList.clear();
|
hasMore = true;
|
||||||
|
return super.onRefresh();
|
||||||
}
|
}
|
||||||
if (offset == '-1') {
|
|
||||||
return;
|
@override
|
||||||
|
Future queryData([bool isRefresh = true]) {
|
||||||
|
if (isRefresh.not && (hasMore.not || offset == '-1')) {
|
||||||
|
return Future.value();
|
||||||
}
|
}
|
||||||
var res = await MemberHttp.memberDynamic(
|
return super.queryData(isRefresh);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool customHandleResponse(Success response) {
|
||||||
|
DynamicsDataModel data = response.response;
|
||||||
|
offset = data.offset?.isNotEmpty == true ? data.offset! : '-1';
|
||||||
|
hasMore = data.hasMore ?? false;
|
||||||
|
if (currentPage != 1 && loadingState.value is Success) {
|
||||||
|
data.items?.insertAll(0, (loadingState.value as Success).response);
|
||||||
|
}
|
||||||
|
loadingState.value = LoadingState.success(data.items);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<LoadingState> customGetData() => MemberHttp.memberDynamic(
|
||||||
offset: offset,
|
offset: offset,
|
||||||
mid: mid,
|
mid: mid,
|
||||||
);
|
);
|
||||||
if (res['status']) {
|
|
||||||
dynamicsList.addAll(res['data'].items);
|
|
||||||
offset = res['data'].offset != '' ? res['data'].offset : '-1';
|
|
||||||
hasMore = res['data'].hasMore;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 上拉加载
|
|
||||||
Future onLoad() async {
|
|
||||||
getMemberDynamic('onLoad');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:PiliPalaX/common/widgets/refresh_indicator.dart';
|
||||||
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:easy_debounce/easy_throttle.dart';
|
import 'package:easy_debounce/easy_throttle.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -36,29 +38,10 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage>
|
|||||||
final String heroTag = Utils.makeHeroTag(mid);
|
final String heroTag = Utils.makeHeroTag(mid);
|
||||||
_memberDynamicController =
|
_memberDynamicController =
|
||||||
Get.put(MemberDynamicsController(mid), tag: heroTag);
|
Get.put(MemberDynamicsController(mid), tag: heroTag);
|
||||||
// _memberDynamicController.scrollController.addListener(
|
|
||||||
// () {
|
|
||||||
// if (_memberDynamicController.scrollController.position.pixels >=
|
|
||||||
// _memberDynamicController.scrollController.position.maxScrollExtent -
|
|
||||||
// 200) {
|
|
||||||
// EasyThrottle.throttle(
|
|
||||||
// 'member_dynamics', const Duration(milliseconds: 1000), () {
|
|
||||||
// _memberDynamicController.onLoad();
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// );
|
|
||||||
dynamicsWaterfallFlow = GStorage.setting
|
dynamicsWaterfallFlow = GStorage.setting
|
||||||
.get(SettingBoxKey.dynamicsWaterfallFlow, defaultValue: true);
|
.get(SettingBoxKey.dynamicsWaterfallFlow, defaultValue: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
// _memberDynamicController.scrollController.removeListener(() {});
|
|
||||||
_memberDynamicController.scrollController.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
super.build(context);
|
super.build(context);
|
||||||
@@ -75,48 +58,32 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage>
|
|||||||
: _buildBody;
|
: _buildBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget get _buildBody => CustomScrollView(
|
Widget get _buildBody => refreshIndicator(
|
||||||
physics: const AlwaysScrollableScrollPhysics(),
|
onRefresh: () async {
|
||||||
// controller: _memberDynamicController.scrollController,
|
await _memberDynamicController.onRefresh();
|
||||||
slivers: [
|
|
||||||
FutureBuilder(
|
|
||||||
future: _memberDynamicController.futureBuilderFuture,
|
|
||||||
builder: (context, snapshot) {
|
|
||||||
if (snapshot.connectionState == ConnectionState.done) {
|
|
||||||
if (snapshot.data != null) {
|
|
||||||
Map data = snapshot.data as Map;
|
|
||||||
List list = _memberDynamicController.dynamicsList;
|
|
||||||
if (data['status']) {
|
|
||||||
return Obx(() {
|
|
||||||
if (list.isEmpty) {
|
|
||||||
return const SliverToBoxAdapter();
|
|
||||||
}
|
|
||||||
if (!dynamicsWaterfallFlow) {
|
|
||||||
return SliverCrossAxisGroup(
|
|
||||||
slivers: [
|
|
||||||
const SliverFillRemaining(),
|
|
||||||
SliverConstrainedCrossAxis(
|
|
||||||
maxExtent: Grid.maxRowWidth * 2,
|
|
||||||
sliver: SliverList(
|
|
||||||
delegate: SliverChildBuilderDelegate(
|
|
||||||
(context, index) {
|
|
||||||
if (index == list.length - 1) {
|
|
||||||
EasyThrottle.throttle('member_dynamics',
|
|
||||||
const Duration(milliseconds: 1000),
|
|
||||||
() {
|
|
||||||
_memberDynamicController.onLoad();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return DynamicPanel(item: list[index]);
|
|
||||||
},
|
},
|
||||||
childCount: list.length,
|
child: Obx(
|
||||||
),
|
() => _memberDynamicController.loadingState.value is Loading
|
||||||
)),
|
? Center(
|
||||||
const SliverFillRemaining(),
|
child: CircularProgressIndicator(),
|
||||||
|
)
|
||||||
|
: CustomScrollView(
|
||||||
|
physics: const AlwaysScrollableScrollPhysics(),
|
||||||
|
slivers: [
|
||||||
|
_buildContent(_memberDynamicController.loadingState.value),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
|
||||||
return SliverWaterfallFlow.extent(
|
_buildContent(LoadingState loadingState) {
|
||||||
|
return loadingState is Success
|
||||||
|
? SliverPadding(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
bottom: MediaQuery.paddingOf(context).bottom,
|
||||||
|
),
|
||||||
|
sliver: dynamicsWaterfallFlow
|
||||||
|
? SliverWaterfallFlow.extent(
|
||||||
maxCrossAxisExtent: Grid.maxRowWidth * 2,
|
maxCrossAxisExtent: Grid.maxRowWidth * 2,
|
||||||
//cacheExtent: 0.0,
|
//cacheExtent: 0.0,
|
||||||
crossAxisSpacing: StyleString.safeSpace,
|
crossAxisSpacing: StyleString.safeSpace,
|
||||||
@@ -132,49 +99,50 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage>
|
|||||||
/// if children is full of viewport, it's the same as fullCrossAxisExtend
|
/// if children is full of viewport, it's the same as fullCrossAxisExtend
|
||||||
// LastChildLayoutType.foot,
|
// LastChildLayoutType.foot,
|
||||||
lastChildLayoutTypeBuilder: (index) {
|
lastChildLayoutTypeBuilder: (index) {
|
||||||
if (index == list.length - 1) {
|
if (index == loadingState.response.length - 1) {
|
||||||
EasyThrottle.throttle('member_dynamics',
|
EasyThrottle.throttle('member_dynamics',
|
||||||
const Duration(milliseconds: 1000), () {
|
const Duration(milliseconds: 1000), () {
|
||||||
_memberDynamicController.onLoad();
|
_memberDynamicController.onLoadMore();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return index == list.length
|
return index == loadingState.response.length
|
||||||
? LastChildLayoutType.foot
|
? LastChildLayoutType.foot
|
||||||
: LastChildLayoutType.none;
|
: LastChildLayoutType.none;
|
||||||
},
|
},
|
||||||
children: [
|
children: (loadingState.response as List)
|
||||||
for (var i in list) DynamicPanel(item: i),
|
.map((item) => DynamicPanel(item: item))
|
||||||
]);
|
.toList(),
|
||||||
|
)
|
||||||
|
: SliverCrossAxisGroup(
|
||||||
|
slivers: [
|
||||||
|
const SliverFillRemaining(),
|
||||||
|
SliverConstrainedCrossAxis(
|
||||||
|
maxExtent: Grid.maxRowWidth * 2,
|
||||||
|
sliver: SliverList(
|
||||||
|
delegate: SliverChildBuilderDelegate(
|
||||||
|
(context, index) {
|
||||||
|
if (index == loadingState.response.length - 1) {
|
||||||
|
EasyThrottle.throttle('member_dynamics',
|
||||||
|
const Duration(milliseconds: 1000), () {
|
||||||
|
_memberDynamicController.onLoadMore();
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
return HttpError(
|
|
||||||
errMsg: snapshot.data['msg'],
|
|
||||||
fn: () {
|
|
||||||
setState(() {
|
|
||||||
_memberDynamicController.futureBuilderFuture =
|
|
||||||
_memberDynamicController
|
|
||||||
.getMemberDynamic('onRefresh');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return HttpError(
|
|
||||||
errMsg: 'NULL',
|
|
||||||
fn: () {
|
|
||||||
setState(() {
|
|
||||||
_memberDynamicController.futureBuilderFuture =
|
|
||||||
_memberDynamicController
|
|
||||||
.getMemberDynamic('onRefresh');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return const SliverToBoxAdapter();
|
|
||||||
}
|
}
|
||||||
|
return DynamicPanel(
|
||||||
|
item: loadingState.response[index]);
|
||||||
},
|
},
|
||||||
|
childCount: loadingState.response.length,
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SliverFillRemaining(),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: HttpError(
|
||||||
|
errMsg: loadingState is Error ? loadingState.errMsg : null,
|
||||||
|
fn: () {
|
||||||
|
_memberDynamicController.onReload();
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user