diff --git a/lib/common/widgets/loading_widget/loading_widget.dart b/lib/common/widgets/loading_widget/loading_widget.dart index a3a6823f..2b7f0c61 100644 --- a/lib/common/widgets/loading_widget/loading_widget.dart +++ b/lib/common/widgets/loading_widget/loading_widget.dart @@ -3,6 +3,9 @@ import 'package:flutter/material.dart'; Widget get loadingWidget => const Center(child: CircularProgressIndicator()); +Widget get linearLoading => + const SliverToBoxAdapter(child: LinearProgressIndicator()); + Widget errorWidget({errMsg, onReload}) => HttpError( isSliver: false, errMsg: errMsg, diff --git a/lib/pages/contact/view.dart b/lib/pages/contact/view.dart index 0f5f00ea..9c8d55bc 100644 --- a/lib/pages/contact/view.dart +++ b/lib/pages/contact/view.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/pages/fan/view.dart'; -import 'package:PiliPlus/pages/follow/child_view.dart'; +import 'package:PiliPlus/pages/follow/child/child_view.dart'; import 'package:PiliPlus/pages/follow_search/view.dart'; import 'package:PiliPlus/pages/share/view.dart' show UserModel; import 'package:PiliPlus/services/account_service.dart'; diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index 8b67359b..86638bf3 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -8,7 +8,6 @@ import 'package:PiliPlus/models/dynamics/up.dart'; import 'package:PiliPlus/models_new/follow/list.dart'; import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/pages/dynamics_tab/controller.dart'; -import 'package:PiliPlus/pages/dynamics_tab/view.dart'; import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; @@ -27,7 +26,6 @@ class DynamicsController extends GetxController RxInt mid = (-1).obs; late TabController tabController; Set tempBannedList = {}; - late List tabsPageList; List hasUpdatedUps = []; int allFollowedUpsPage = 1; int allFollowedUpsTotal = 0; @@ -57,9 +55,6 @@ class DynamicsController extends GetxController initialIndex: GStorage.setting .get(SettingBoxKey.defaultDynamicType, defaultValue: 0), ); - tabsPageList = DynamicsTabType.values - .map((e) => DynamicsTabPage(dynamicsType: e)) - .toList(); queryFollowUp(); } diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index 4a5eba5f..bbc69cfd 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/models/common/dynamic/up_panel_position.dart'; import 'package:PiliPlus/pages/dynamics/controller.dart'; import 'package:PiliPlus/pages/dynamics/widgets/up_panel.dart'; import 'package:PiliPlus/pages/dynamics_create/view.dart'; +import 'package:PiliPlus/pages/dynamics_tab/view.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart' hide DraggableScrollableSheet; @@ -164,7 +165,9 @@ class _DynamicsPageState extends State Expanded( child: videoTabBarView( controller: _dynamicsController.tabController, - children: _dynamicsController.tabsPageList, + children: DynamicsTabType.values + .map((e) => DynamicsTabPage(dynamicsType: e)) + .toList(), ), ), ], diff --git a/lib/pages/dynamics_topic_rcmd/view.dart b/lib/pages/dynamics_topic_rcmd/view.dart index fadd31cb..1012a846 100644 --- a/lib/pages/dynamics_topic_rcmd/view.dart +++ b/lib/pages/dynamics_topic_rcmd/view.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; +import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart'; @@ -43,7 +44,7 @@ class _DynTopicRcmdPageState extends State { Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { - Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), + Loading() => linearLoading, Success(:var response) => response?.isNotEmpty == true ? SliverList.builder( itemCount: response!.length, diff --git a/lib/pages/follow/child_controller.dart b/lib/pages/follow/child/child_controller.dart similarity index 100% rename from lib/pages/follow/child_controller.dart rename to lib/pages/follow/child/child_controller.dart diff --git a/lib/pages/follow/child_view.dart b/lib/pages/follow/child/child_view.dart similarity index 92% rename from lib/pages/follow/child_view.dart rename to lib/pages/follow/child/child_view.dart index 375ae6d2..e974b488 100644 --- a/lib/pages/follow/child_view.dart +++ b/lib/pages/follow/child/child_view.dart @@ -4,7 +4,7 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/follow_order_type.dart'; import 'package:PiliPlus/models_new/follow/list.dart'; -import 'package:PiliPlus/pages/follow/child_controller.dart'; +import 'package:PiliPlus/pages/follow/child/child_controller.dart'; import 'package:PiliPlus/pages/follow/controller.dart'; import 'package:PiliPlus/pages/follow/widgets/follow_item.dart'; import 'package:PiliPlus/pages/share/view.dart' show UserModel; @@ -15,12 +15,14 @@ import 'package:get/get.dart'; class FollowChildPage extends StatefulWidget { const FollowChildPage({ super.key, + this.tag, this.controller, required this.mid, this.tagid, this.onSelect, }); + final String? tag; final FollowController? controller; final int mid; final int? tagid; @@ -33,8 +35,9 @@ class FollowChildPage extends StatefulWidget { class _FollowChildPageState extends State with AutomaticKeepAliveClientMixin { late final _followController = Get.put( - FollowChildController(widget.controller, widget.mid, widget.tagid), - tag: Utils.generateRandomString(8)); + FollowChildController(widget.controller, widget.mid, widget.tagid), + tag: '${widget.tag ?? Utils.generateRandomString(8)}${widget.tagid}', + ); @override Widget build(BuildContext context) { @@ -62,6 +65,7 @@ class _FollowChildPageState extends State Widget get _child => refreshIndicator( onRefresh: _followController.onRefresh, child: CustomScrollView( + controller: _followController.scrollController, physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverPadding( diff --git a/lib/pages/follow/view.dart b/lib/pages/follow/view.dart index b347a8c6..79c26d7b 100644 --- a/lib/pages/follow/view.dart +++ b/lib/pages/follow/view.dart @@ -3,7 +3,8 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/member/tags.dart'; -import 'package:PiliPlus/pages/follow/child_view.dart'; +import 'package:PiliPlus/pages/follow/child/child_controller.dart'; +import 'package:PiliPlus/pages/follow/child/child_view.dart'; import 'package:PiliPlus/pages/follow/controller.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -18,10 +19,9 @@ class FollowPage extends StatefulWidget { } class _FollowPageState extends State { - final FollowController _followController = Get.put( - FollowController(), - tag: Utils.generateRandomString(8), - ); + final _tag = Utils.generateRandomString(8); + late final FollowController _followController = + Get.put(FollowController(), tag: _tag); @override Widget build(BuildContext context) { @@ -69,11 +69,17 @@ class _FollowPageState extends State { ), body: _followController.isOwner ? Obx(() => _buildBody(_followController.followState.value)) - : FollowChildPage( - controller: _followController, mid: _followController.mid), + : _childPage(), ); } + Widget _childPage([MemberTagItemModel? item]) => FollowChildPage( + tag: _tag, + controller: _followController, + mid: _followController.mid, + tagid: item?.tagid, + ); + bool _isCustomTag(int? tagid) { return tagid != null && tagid != 0 && tagid != -10 && tagid != -2; } @@ -97,7 +103,11 @@ class _FollowPageState extends State { int? count = item.count; if (_isCustomTag(item.tagid)) { return GestureDetector( - onLongPress: () => _onHandleTag(index, item), + behavior: HitTestBehavior.translucent, + onLongPress: () { + Feedback.forLongPress(context); + _onHandleTag(index, item); + }, child: Tab( child: Row( children: [ @@ -117,9 +127,13 @@ class _FollowPageState extends State { onTap: (value) { if (!_followController.tabController!.indexIsChanging) { final item = _followController.tabs[value]; - if (_isCustomTag(item.tagid)) { - _onHandleTag(value, item); - } + // if (_isCustomTag(item.tagid)) { + // _onHandleTag(value, item); + // } + try { + Get.find(tag: '$_tag${item.tagid}') + .animateToTop(); + } catch (_) {} } }, ), @@ -129,24 +143,13 @@ class _FollowPageState extends State { color: Colors.transparent, child: tabBarView( controller: _followController.tabController, - children: _followController.tabs - .map( - (item) => FollowChildPage( - controller: _followController, - mid: _followController.mid, - tagid: item.tagid, - ), - ) - .toList(), + children: _followController.tabs.map(_childPage).toList(), ), ), ), ], ), - Error() => FollowChildPage( - controller: _followController, - mid: _followController.mid, - ), + Error() => _childPage(), }; } diff --git a/lib/pages/member_coin_log/view.dart b/lib/pages/member_coin_log/view.dart index df4f2a03..38cbfe1f 100644 --- a/lib/pages/member_coin_log/view.dart +++ b/lib/pages/member_coin_log/view.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; +import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/coin_log/list.dart'; import 'package:PiliPlus/pages/member_coin_log/controller.dart'; @@ -45,7 +46,7 @@ class _MemberCoinLogPageState extends State { Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { - Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), + Loading() => linearLoading, Success(:var response) => response?.isNotEmpty == true ? Builder( builder: (context) { diff --git a/lib/pages/pgc_index/view.dart b/lib/pages/pgc_index/view.dart index 1559c156..1f0dbdfd 100644 --- a/lib/pages/pgc_index/view.dart +++ b/lib/pages/pgc_index/view.dart @@ -205,7 +205,7 @@ class _PgcIndexPageState extends State Widget _buildList(LoadingState?> loadingState) { return switch (loadingState) { - Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), + Loading() => linearLoading, Success(:var response) => response?.isNotEmpty == true ? SliverGrid( gridDelegate: SliverGridDelegateWithExtentAndRatio( diff --git a/lib/pages/search_trending/view.dart b/lib/pages/search_trending/view.dart index d83bfe4c..891f3cc8 100644 --- a/lib/pages/search_trending/view.dart +++ b/lib/pages/search_trending/view.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; +import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/search/search_trending/list.dart'; @@ -148,7 +149,7 @@ class _SearchTrendingPageState extends State { color: theme.colorScheme.outline.withValues(alpha: 0.1), ); return switch (loadingState) { - Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), + Loading() => linearLoading, Success(:var response) => response?.isNotEmpty == true ? SliverList.separated( itemCount: response!.length, diff --git a/lib/pages/setting/pages/logs.dart b/lib/pages/setting/pages/logs.dart index 848eebe3..f2ffe4bc 100644 --- a/lib/pages/setting/pages/logs.dart +++ b/lib/pages/setting/pages/logs.dart @@ -149,6 +149,9 @@ class _LogsPageState extends State { ? SafeArea( bottom: false, child: ListView.separated( + padding: EdgeInsets.only( + bottom: MediaQuery.paddingOf(context).bottom + 80, + ), itemCount: logsContent.length, itemBuilder: (context, index) { final log = logsContent[index];