mod: home: show anonymous icon

Closes #81

opt: SliverPersistentHeaderDelegate

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-01 11:46:23 +08:00
parent dda0fc15c7
commit 144a9b604a
17 changed files with 101 additions and 93 deletions

View File

@@ -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子组件
//shrinkOffsetchild偏移值minExtent~maxExtent
//overlapsContentSliverPersistentHeader覆盖其他子组件返回true否则返回false
return child;
}
//SliverPersistentHeader最大高度
@override
double get maxExtent => _maxExtent;
//SliverPersistentHeader最小高度
@override
double get minExtent => _minExtent;
@override
bool shouldRebuild(
covariant CustomSliverPersistentHeaderDelegate oldDelegate) {
return false;
}
}

View File

@@ -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,

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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<DynamicDetailPage>
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<DynamicDetailPage>
};
}
}
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子组件
//shrinkOffsetchild偏移值minExtent~maxExtent
//overlapsContentSliverPersistentHeader覆盖其他子组件返回true否则返回false
return child;
}
//SliverPersistentHeader最大高度
@override
double get maxExtent => _maxExtent;
//SliverPersistentHeader最小高度
@override
double get minExtent => _minExtent;
@override
bool shouldRebuild(covariant _MySliverPersistentHeaderDelegate oldDelegate) {
return true;
}
}

View File

@@ -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(

View File

@@ -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<MemberVideo>
SliverPersistentHeader(
pinned: false,
floating: true,
delegate: MySliverPersistentHeaderDelegate(
delegate: CustomSliverPersistentHeaderDelegate(
extent: 40,
child: Container(
height: 40,
padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),

View File

@@ -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(

View File

@@ -65,13 +65,13 @@ class _MinePageState extends State<MinePage> {
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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -79,10 +79,10 @@ class _PrivacySettingState extends State<PrivacySetting> {
},
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,

View File

@@ -523,7 +523,7 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
color: t.colorScheme.outline,
),
),
if (MineController.anonymity) ...<Widget>[
if (MineController.anonymity.value) ...<Widget>[
const SizedBox(width: 10),
Icon(
MdiIcons.incognito,

View File

@@ -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<HorizontalMemberPage> {
return SliverPersistentHeader(
pinned: false,
floating: true,
delegate: MySliverPersistentHeaderDelegate(
delegate: CustomSliverPersistentHeaderDelegate(
extent: 40,
child: Container(
height: 40,
padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),

View File

@@ -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<VideoReplyPanel>
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<VideoReplyPanel>
};
}
}
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子组件
//shrinkOffsetchild偏移值minExtent~maxExtent
//overlapsContentSliverPersistentHeader覆盖其他子组件返回true否则返回false
return child;
}
//SliverPersistentHeader最大高度
@override
double get maxExtent => _maxExtent;
//SliverPersistentHeader最小高度
@override
double get minExtent => _minExtent;
@override
bool shouldRebuild(covariant MySliverPersistentHeaderDelegate oldDelegate) {
return true;
}
}

View File

@@ -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) {