diff --git a/lib/http/member.dart b/lib/http/member.dart index 2032355a1..b63fd595a 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -447,8 +447,7 @@ class MemberHttp { if (res.data['code'] == 0) { return { 'status': true, - 'data': DynamicsDataModel.fromJson(res.data['data']).items, - 'count': res.data['data']?['total'], + 'data': DynamicsDataModel.fromJson(res.data['data']), }; } else { return { diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 9d7c9f2fe..20ed82e61 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -7,10 +7,12 @@ class DynamicsDataModel { this.hasMore, this.items, this.offset, + this.total, }); bool? hasMore; List? items; String? offset; + int? total; DynamicsDataModel.fromJson(Map json) { hasMore = json['has_more']; @@ -18,6 +20,7 @@ class DynamicsDataModel { ?.map((e) => DynamicItemModel.fromJson(e)) .toList(); offset = json['offset']; + total = json['total']; } } diff --git a/lib/pages/dynamics/tab/view.dart b/lib/pages/dynamics/tab/view.dart index dba38d650..e7d109654 100644 --- a/lib/pages/dynamics/tab/view.dart +++ b/lib/pages/dynamics/tab/view.dart @@ -130,70 +130,76 @@ class _DynamicsTabPageState return switch (loadingState) { Loading() => skeleton(), Success() => (loadingState.response as List?)?.isNotEmpty == true - ? dynamicsWaterfallFlow - ? SliverWaterfallFlow.extent( - maxCrossAxisExtent: Grid.smallCardWidth * 2, - //cacheExtent: 0.0, - crossAxisSpacing: StyleString.cardSpace / 2, - // mainAxisSpacing: StyleString.cardSpace / 2, + ? SliverPadding( + padding: EdgeInsets.only( + bottom: MediaQuery.paddingOf(context).bottom + 80, + ), + sliver: dynamicsWaterfallFlow + ? SliverWaterfallFlow.extent( + maxCrossAxisExtent: Grid.smallCardWidth * 2, + //cacheExtent: 0.0, + crossAxisSpacing: StyleString.cardSpace / 2, + // mainAxisSpacing: StyleString.cardSpace / 2, - lastChildLayoutTypeBuilder: (index) { - if (index == loadingState.response.length - 1) { - controller.onLoadMore(); - } - return index == loadingState.response.length - ? LastChildLayoutType.foot - : LastChildLayoutType.none; - }, - children: [ - if (dynamicsController.tabController.index == 4 && - dynamicsController.mid.value != -1) ...[ - for (var i in loadingState.response) - DynamicPanel( - item: i, - onRemove: controller.onRemove, - ), - ] else ...[ - for (var i in loadingState.response) - if (!dynamicsController.tempBannedList - .contains(i.modules?.moduleAuthor?.mid)) - DynamicPanel( - item: i, - onRemove: controller.onRemove, - ), - ] - ], - ) - : SliverCrossAxisGroup( - slivers: [ - const SliverFillRemaining(), - SliverConstrainedCrossAxis( - maxExtent: Grid.smallCardWidth * 2, - sliver: SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) { - if (index == loadingState.response.length - 1) { - controller.onLoadMore(); - } - if ((dynamicsController.tabController.index == 4 && - dynamicsController.mid.value != -1) || - !dynamicsController.tempBannedList.contains( - loadingState.response[index].modules - ?.moduleAuthor?.mid)) { - return DynamicPanel( - item: loadingState.response[index], + lastChildLayoutTypeBuilder: (index) { + if (index == loadingState.response.length - 1) { + controller.onLoadMore(); + } + return index == loadingState.response.length + ? LastChildLayoutType.foot + : LastChildLayoutType.none; + }, + children: [ + if (dynamicsController.tabController.index == 4 && + dynamicsController.mid.value != -1) ...[ + for (var i in loadingState.response) + DynamicPanel( + item: i, + onRemove: controller.onRemove, + ), + ] else ...[ + for (var i in loadingState.response) + if (!dynamicsController.tempBannedList + .contains(i.modules?.moduleAuthor?.mid)) + DynamicPanel( + item: i, onRemove: controller.onRemove, - ); - } - return const SizedBox.shrink(); - }, - childCount: loadingState.response.length, + ), + ] + ], + ) + : SliverCrossAxisGroup( + slivers: [ + const SliverFillRemaining(), + SliverConstrainedCrossAxis( + maxExtent: Grid.smallCardWidth * 2, + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == loadingState.response.length - 1) { + controller.onLoadMore(); + } + if ((dynamicsController.tabController.index == + 4 && + dynamicsController.mid.value != -1) || + !dynamicsController.tempBannedList.contains( + loadingState.response[index].modules + ?.moduleAuthor?.mid)) { + return DynamicPanel( + item: loadingState.response[index], + onRemove: controller.onRemove, + ); + } + return const SizedBox.shrink(); + }, + childCount: loadingState.response.length, + ), + ), ), - ), + const SliverFillRemaining(), + ], ), - const SliverFillRemaining(), - ], - ) + ) : HttpError( callback: controller.onReload, ), diff --git a/lib/pages/member_dynamics/view.dart b/lib/pages/member_dynamics/view.dart index 9cf727f16..41d20fc48 100644 --- a/lib/pages/member_dynamics/view.dart +++ b/lib/pages/member_dynamics/view.dart @@ -78,7 +78,7 @@ class _MemberDynamicsPageState extends State Success() => (loadingState.response as List?)?.isNotEmpty == true ? SliverPadding( padding: EdgeInsets.only( - bottom: MediaQuery.paddingOf(context).bottom, + bottom: MediaQuery.paddingOf(context).bottom + 80, ), sliver: dynamicsWaterfallFlow ? SliverWaterfallFlow.extent( diff --git a/lib/pages/member_search/controller.dart b/lib/pages/member_search/controller.dart index dec773428..395639ff3 100644 --- a/lib/pages/member_search/controller.dart +++ b/lib/pages/member_search/controller.dart @@ -1,4 +1,6 @@ import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models/dynamics/result.dart'; +import 'package:PiliPlus/models/member/archive.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -88,18 +90,24 @@ class MemberSearchController extends GetxController keyword: textEditingController.text, ); if (res['status']) { + DynamicsDataModel data = res['data']; + if (data.hasMore == false || data.items.isNullOrEmpty) { + isEndDynamic = true; + } if (isRefresh) { - dynamicCount.value = res['count'] ?? -1; + dynamicCount.value = data.total ?? 0; } + offset = data.offset ?? ''; if (isRefresh.not && dynamicState.value is Success) { - res['data'].insertAll(0, (dynamicState.value as Success).response); + data.items ??= []; + data.items!.insertAll(0, (dynamicState.value as Success).response); } - dynamicState.value = LoadingState.success(res['data']); - if (res['data'].length >= dynamicCount.value) { + if (!isEndDynamic && (data.items?.length ?? 0) >= dynamicCount.value) { isEndDynamic = true; } dynamicPn++; - } else { + dynamicState.value = LoadingState.success(data.items); + } else if (isRefresh) { dynamicState.value = LoadingState.error(res['msg']); } } @@ -115,21 +123,26 @@ class MemberSearchController extends GetxController wwebid: wwebid, ); if (res['status']) { + MemberArchiveDataModel data = res['data']; if (isRefresh) { - archiveCount.value = res['data'].page['count']; + archiveCount.value = data.page?['count'] ?? 0; + } + if (data.list == null || data.list!.vlist.isNullOrEmpty) { + isEndArchive = true; } if (isRefresh.not && archiveState.value is Success) { - res['data'] - .list - .vlist - ?.insertAll(0, (archiveState.value as Success).response); + data.list ??= ArchiveListModel(); + data.list!.vlist ??= []; + data.list!.vlist! + .insertAll(0, (archiveState.value as Success).response); } - archiveState.value = LoadingState.success(res['data'].list.vlist); - if (res['data'].list.vlist.length >= archiveCount.value) { + if (!isEndArchive && + (data.list?.vlist?.length ?? 0) >= archiveCount.value) { isEndArchive = true; } archivePn++; - } else { + archiveState.value = LoadingState.success(data.list?.vlist); + } else if (isRefresh) { archiveState.value = LoadingState.error(res['msg']); } } diff --git a/lib/pages/member_search/search_dynamic.dart b/lib/pages/member_search/search_dynamic.dart index 80287a7f5..01bd78a3d 100644 --- a/lib/pages/member_search/search_dynamic.dart +++ b/lib/pages/member_search/search_dynamic.dart @@ -1,14 +1,11 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/loading_widget.dart'; -import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/member_search/controller.dart'; -import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/storage.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -42,7 +39,7 @@ class SearchDynamic extends StatelessWidget { slivers: [ SliverPadding( padding: EdgeInsets.only( - bottom: MediaQuery.paddingOf(context).bottom, + bottom: MediaQuery.paddingOf(context).bottom + 80, ), sliver: dynamicsWaterfallFlow ? SliverWaterfallFlow.extent( @@ -111,53 +108,4 @@ class SearchDynamic extends StatelessWidget { LoadingState() => throw UnimplementedError(), }; } - - _buildHeader({ - required BuildContext context, - required String face, - required String name, - required dynamic vip, - required dynamic pubTime, - }) { - return Row( - children: [ - NetworkImgLayer( - width: 40, - height: 40, - type: 'avatar', - src: face, - ), - const SizedBox(width: 10), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - name, - style: TextStyle( - color: vip != null - ? (vip?['status'] ?? vip?['vipStatus'] ?? 0) > 0 && - (vip?['type'] ?? vip?['vipType']) == 2 - ? context.vipColor - : null - : null, - fontSize: Theme.of(context).textTheme.titleSmall!.fontSize, - ), - ), - ], - ), - if (pubTime != null) - Text( - Utils.dateFormat(pubTime), - style: TextStyle( - fontSize: 13, - color: Theme.of(context).colorScheme.outline, - ), - ), - ], - ), - ], - ); - } }