diff --git a/lib/common/widgets/custom_sliver_persistent_header_delegate.dart b/lib/common/widgets/custom_sliver_persistent_header_delegate.dart new file mode 100644 index 000000000..3b9540767 --- /dev/null +++ b/lib/common/widgets/custom_sliver_persistent_header_delegate.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class CustomSliverPersistentHeaderDelegate + extends SliverPersistentHeaderDelegate { + CustomSliverPersistentHeaderDelegate({ + required this.child, + double extent = 45, + }) : _minExtent = extent, + _maxExtent = extent; + final double _minExtent; + final double _maxExtent; + final Widget child; + + @override + Widget build( + BuildContext context, double shrinkOffset, bool overlapsContent) { + //创建child子组件 + //shrinkOffset:child偏移值minExtent~maxExtent + //overlapsContent:SliverPersistentHeader覆盖其他子组件返回true,否则返回false + return child; + } + + //SliverPersistentHeader最大高度 + @override + double get maxExtent => _maxExtent; + + //SliverPersistentHeader最小高度 + @override + double get minExtent => _minExtent; + + @override + bool shouldRebuild( + covariant CustomSliverPersistentHeaderDelegate oldDelegate) { + return false; + } +} diff --git a/lib/common/widgets/video_popup_menu.dart b/lib/common/widgets/video_popup_menu.dart index 5eb4e35fa..71ee5a7a5 100644 --- a/lib/common/widgets/video_popup_menu.dart +++ b/lib/common/widgets/video_popup_menu.dart @@ -273,10 +273,10 @@ class VideoCustomActions { ); }), VideoCustomAction( - "${MineController.anonymity ? '退出' : '进入'}无痕模式", + "${MineController.anonymity.value ? '退出' : '进入'}无痕模式", 'anonymity', Icon( - MineController.anonymity + MineController.anonymity.value ? MdiIcons.incognitoOff : MdiIcons.incognito, size: 16, diff --git a/lib/http/interceptor_anonymity.dart b/lib/http/interceptor_anonymity.dart index d264c5840..837d43c60 100644 --- a/lib/http/interceptor_anonymity.dart +++ b/lib/http/interceptor_anonymity.dart @@ -28,7 +28,7 @@ class AnonymityInterceptor extends Interceptor { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - if (MineController.anonymity) { + if (MineController.anonymity.value) { String uri = options.uri.toString(); for (var i in anonymityList) { // 如果请求的url包含无痕列表中的url,则清空cookie diff --git a/lib/http/video.dart b/lib/http/video.dart index 928a638c4..09249abd1 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -212,7 +212,7 @@ class VideoHttp { // 免登录查看1080p if ((GStorage.userInfo.get('userInfoCache') == null || - MineController.anonymity) && + MineController.anonymity.value) && GStorage.setting.get(SettingBoxKey.p1080, defaultValue: true)) { data['try_look'] = 1; } diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index d409c64af..09f7ca09a 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:math'; +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/refresh_indicator.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/video/detail/reply/widgets/reply_item.dart'; @@ -398,7 +399,7 @@ class _DynamicDetailPageState extends State SliverPersistentHeader replyPersistentHeader(BuildContext context) { return SliverPersistentHeader( - delegate: _MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( child: Container( color: Theme.of(context).colorScheme.surface, height: 45, @@ -531,33 +532,3 @@ class _DynamicDetailPageState extends State }; } } - -class _MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate { - final double _minExtent = 45; - final double _maxExtent = 45; - final Widget child; - - _MySliverPersistentHeaderDelegate({required this.child}); - - @override - Widget build( - BuildContext context, double shrinkOffset, bool overlapsContent) { - //创建child子组件 - //shrinkOffset:child偏移值minExtent~maxExtent - //overlapsContent:SliverPersistentHeader覆盖其他子组件返回true,否则返回false - return child; - } - - //SliverPersistentHeader最大高度 - @override - double get maxExtent => _maxExtent; - - //SliverPersistentHeader最小高度 - @override - double get minExtent => _minExtent; - - @override - bool shouldRebuild(covariant _MySliverPersistentHeaderDelegate oldDelegate) { - return true; - } -} diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index fcaec1ed2..0434f499d 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -1,10 +1,12 @@ import 'dart:async'; +import 'package:PiliPalaX/pages/mine/controller.dart'; import 'package:PiliPalaX/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPalaX/common/widgets/network_img_layer.dart'; import 'package:PiliPalaX/utils/feed_back.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import './controller.dart'; class HomePage extends StatefulWidget { @@ -155,6 +157,7 @@ class SearchBarAndUser extends StatelessWidget { child: Obx( () => homeController.userLogin.value ? Stack( + clipBehavior: Clip.none, children: [ NetworkImgLayer( type: 'avatar', @@ -177,7 +180,31 @@ class SearchBarAndUser extends StatelessWidget { ), ), ), - ) + ), + Positioned( + right: -6, + bottom: -6, + child: Obx(() => MineController.anonymity.value + ? IgnorePointer( + child: Container( + padding: const EdgeInsets.all(2), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .secondaryContainer, + shape: BoxShape.circle, + ), + child: Icon( + size: 16, + MdiIcons.incognito, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer, + ), + ), + ) + : const SizedBox.shrink()), + ), ], ) : DefaultUser( diff --git a/lib/pages/member/new/content/member_contribute/content/video/member_video.dart b/lib/pages/member/new/content/member_contribute/content/video/member_video.dart index be76e0410..8084fb049 100644 --- a/lib/pages/member/new/content/member_contribute/content/video/member_video.dart +++ b/lib/pages/member/new/content/member_contribute/content/video/member_video.dart @@ -1,4 +1,5 @@ import 'package:PiliPalaX/common/constants.dart'; +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/loading_widget.dart'; import 'package:PiliPalaX/common/widgets/refresh_indicator.dart'; import 'package:PiliPalaX/common/widgets/video_card_h_member_video.dart'; @@ -7,7 +8,6 @@ import 'package:PiliPalaX/pages/member/new/content/member_contribute/content/vid import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart' show ContributeType; import 'package:PiliPalaX/pages/member/new/controller.dart'; -import 'package:PiliPalaX/pages/video/detail/reply/view.dart'; import 'package:PiliPalaX/utils/grid.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -71,7 +71,8 @@ class _MemberVideoState extends State SliverPersistentHeader( pinned: false, floating: true, - delegate: MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( + extent: 40, child: Container( height: 40, padding: const EdgeInsets.fromLTRB(12, 0, 6, 0), diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index 3caca5184..7331e9779 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -19,8 +19,8 @@ class MineController extends GetxController { static Box get setting => GStorage.setting; - static bool anonymity = - setting.get(SettingBoxKey.anonymity, defaultValue: false); + static RxBool anonymity = + (setting.get(SettingBoxKey.anonymity, defaultValue: false) as bool).obs; ThemeType get nextThemeType => ThemeType.values[(themeType.value.index + 1) % ThemeType.values.length]; @@ -92,12 +92,12 @@ class MineController extends GetxController { userStat.value = UserStat(); GStorage.userInfo.delete('userInfoCache'); userLogin.value = false; - anonymity = false; + anonymity.value = false; } static onChangeAnonymity(BuildContext context) { - anonymity = !anonymity; - if (anonymity) { + anonymity.value = !anonymity.value; + if (anonymity.value) { SmartDialog.show( clickMaskDismiss: false, usePenetrate: true, @@ -140,7 +140,7 @@ class MineController extends GetxController { onPressed: () { SmartDialog.dismiss(); setting.put(SettingBoxKey.anonymity, true); - anonymity = true; + anonymity.value = true; SmartDialog.showToast('已设为永久无痕模式'); }, child: Text( @@ -154,7 +154,7 @@ class MineController extends GetxController { onPressed: () { SmartDialog.dismiss(); setting.put(SettingBoxKey.anonymity, false); - anonymity = true; + anonymity.value = true; SmartDialog.showToast('已设为临时无痕模式'); }, child: Text( diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index b0c13354d..32e875af1 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -65,13 +65,13 @@ class _MinePageState extends State { tapTargetSize: MaterialTapTargetSize.shrinkWrap, // the '2023' part ), - tooltip: "${MineController.anonymity ? '退出' : '进入'}无痕模式", + tooltip: "${MineController.anonymity.value ? '退出' : '进入'}无痕模式", onPressed: () { MineController.onChangeAnonymity(context); setState(() {}); }, icon: Icon( - MineController.anonymity + MineController.anonymity.value ? MdiIcons.incognito : MdiIcons.incognitoOff, size: 24, diff --git a/lib/pages/search_panel/widgets/article_panel.dart b/lib/pages/search_panel/widgets/article_panel.dart index a7687ce4c..4c6207dd1 100644 --- a/lib/pages/search_panel/widgets/article_panel.dart +++ b/lib/pages/search_panel/widgets/article_panel.dart @@ -1,11 +1,10 @@ +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/common/widgets/image_save.dart'; import 'package:PiliPalaX/common/widgets/loading_widget.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/search/widgets/search_text.dart'; import 'package:PiliPalaX/pages/search_panel/controller.dart'; -import 'package:PiliPalaX/pages/video/detail/reply/view.dart' - show MySliverPersistentHeaderDelegate; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -27,7 +26,8 @@ Widget searchArticlePanel(context, searchPanelCtr, LoadingState loadingState) { SliverPersistentHeader( pinned: false, floating: true, - delegate: MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( + extent: 40, child: Container( height: 40, color: Theme.of(context).colorScheme.surface, diff --git a/lib/pages/search_panel/widgets/user_panel.dart b/lib/pages/search_panel/widgets/user_panel.dart index 843a2b8ed..5c8b2ccee 100644 --- a/lib/pages/search_panel/widgets/user_panel.dart +++ b/lib/pages/search_panel/widgets/user_panel.dart @@ -1,10 +1,9 @@ +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/common/widgets/loading_widget.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/search/widgets/search_text.dart'; import 'package:PiliPalaX/pages/search_panel/controller.dart'; -import 'package:PiliPalaX/pages/video/detail/reply/view.dart' - show MySliverPersistentHeaderDelegate; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -25,7 +24,8 @@ Widget searchUserPanel(context, searchPanelCtr, LoadingState loadingState) { SliverPersistentHeader( pinned: false, floating: true, - delegate: MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( + extent: 40, child: Container( height: 40, color: Theme.of(context).colorScheme.surface, diff --git a/lib/pages/search_panel/widgets/video_panel.dart b/lib/pages/search_panel/widgets/video_panel.dart index e97268f25..f54cccfb7 100644 --- a/lib/pages/search_panel/widgets/video_panel.dart +++ b/lib/pages/search_panel/widgets/video_panel.dart @@ -1,9 +1,8 @@ +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/common/widgets/loading_widget.dart'; import 'package:PiliPalaX/http/loading_state.dart'; import 'package:PiliPalaX/pages/search/widgets/search_text.dart'; -import 'package:PiliPalaX/pages/video/detail/reply/view.dart' - show MySliverPersistentHeaderDelegate; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -23,7 +22,8 @@ Widget searchVideoPanel(context, ctr, LoadingState loadingState) { SliverPersistentHeader( pinned: false, floating: true, - delegate: MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( + extent: 34, child: Container( height: 34, color: Theme.of(context).colorScheme.surface, diff --git a/lib/pages/setting/privacy_setting.dart b/lib/pages/setting/privacy_setting.dart index 2c3f0974a..6696a3792 100644 --- a/lib/pages/setting/privacy_setting.dart +++ b/lib/pages/setting/privacy_setting.dart @@ -79,10 +79,10 @@ class _PrivacySettingState extends State { }, leading: const Icon(Icons.privacy_tip_outlined), dense: false, - title: Text(MineController.anonymity ? '退出无痕模式' : '进入无痕模式', + title: Text(MineController.anonymity.value ? '退出无痕模式' : '进入无痕模式', style: titleStyle), subtitle: Text( - MineController.anonymity + MineController.anonymity.value ? '已进入无痕模式,搜索、观看视频/直播不携带Cookie与CSRF,其余操作不受影响' : '未开启无痕模式,将使用账户信息提供完整服务', style: subTitleStyle, diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index 464d0231a..212e4f072 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -523,7 +523,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { color: t.colorScheme.outline, ), ), - if (MineController.anonymity) ...[ + if (MineController.anonymity.value) ...[ const SizedBox(width: 10), Icon( MdiIcons.incognito, diff --git a/lib/pages/video/detail/member/horizontal_member_page.dart b/lib/pages/video/detail/member/horizontal_member_page.dart index 1bf974f55..1c23173ce 100644 --- a/lib/pages/video/detail/member/horizontal_member_page.dart +++ b/lib/pages/video/detail/member/horizontal_member_page.dart @@ -1,4 +1,5 @@ import 'package:PiliPalaX/common/constants.dart'; +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/icon_button.dart'; import 'package:PiliPalaX/common/widgets/loading_widget.dart'; import 'package:PiliPalaX/common/widgets/network_img_layer.dart'; @@ -8,8 +9,6 @@ import 'package:PiliPalaX/models/member/info.dart'; import 'package:PiliPalaX/pages/video/detail/controller.dart'; import 'package:PiliPalaX/pages/video/detail/introduction/controller.dart'; import 'package:PiliPalaX/pages/video/detail/member/controller.dart'; -import 'package:PiliPalaX/pages/video/detail/reply/view.dart' - show MySliverPersistentHeaderDelegate; import 'package:PiliPalaX/utils/extension.dart'; import 'package:PiliPalaX/utils/grid.dart'; import 'package:PiliPalaX/utils/id_utils.dart'; @@ -111,7 +110,8 @@ class _HorizontalMemberPageState extends State { return SliverPersistentHeader( pinned: false, floating: true, - delegate: MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( + extent: 40, child: Container( height: 40, padding: const EdgeInsets.fromLTRB(12, 0, 6, 0), diff --git a/lib/pages/video/detail/reply/view.dart b/lib/pages/video/detail/reply/view.dart index e9b25f4f6..908620df1 100644 --- a/lib/pages/video/detail/reply/view.dart +++ b/lib/pages/video/detail/reply/view.dart @@ -1,3 +1,4 @@ +import 'package:PiliPalaX/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPalaX/common/widgets/refresh_indicator.dart'; import 'package:PiliPalaX/common/widgets/http_error.dart'; import 'package:PiliPalaX/http/loading_state.dart'; @@ -131,7 +132,8 @@ class _VideoReplyPanelState extends State SliverPersistentHeader( pinned: false, floating: true, - delegate: MySliverPersistentHeaderDelegate( + delegate: CustomSliverPersistentHeaderDelegate( + extent: 40, child: Container( height: 40, padding: const EdgeInsets.fromLTRB(12, 0, 6, 0), @@ -298,32 +300,3 @@ class _VideoReplyPanelState extends State }; } } - -class MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate { - MySliverPersistentHeaderDelegate({required this.child}); - final double _minExtent = 45; - final double _maxExtent = 45; - final Widget child; - - @override - Widget build( - BuildContext context, double shrinkOffset, bool overlapsContent) { - //创建child子组件 - //shrinkOffset:child偏移值minExtent~maxExtent - //overlapsContent:SliverPersistentHeader覆盖其他子组件返回true,否则返回false - return child; - } - - //SliverPersistentHeader最大高度 - @override - double get maxExtent => _maxExtent; - - //SliverPersistentHeader最小高度 - @override - double get minExtent => _minExtent; - - @override - bool shouldRebuild(covariant MySliverPersistentHeaderDelegate oldDelegate) { - return true; - } -} diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 4e7a5a242..a9f6c73cb 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -1234,7 +1234,7 @@ class PlPlayerController { dynamic bvid, dynamic cid, }) async { - if (!_enableHeart || MineController.anonymity || progress == 0) { + if (!_enableHeart || MineController.anonymity.value || progress == 0) { return; } else if (playerStatus.status.value == PlayerStatus.paused) { if (isManual.not) {