feat: custom refresh dragPercent/displacement

related #139

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-11 21:22:29 +08:00
parent 4075978dc4
commit 591078d4e4
4 changed files with 124 additions and 41 deletions

View File

@@ -10,7 +10,7 @@ Widget refreshIndicator({
required Widget child,
}) {
return RefreshIndicator(
displacement: 10,
displacement: displacement,
onRefresh: onRefresh,
child: child,
);
@@ -22,7 +22,9 @@ Widget refreshIndicator({
// The over-scroll distance that moves the indicator to its maximum
// displacement, as a percentage of the scrollable's container extent.
const double _kDragContainerExtentPercentage = 0.15;
double displacement = 40;
double kDragContainerExtentPercentage = 0.25;
// How much the scroll's drag gesture can overshoot the RefreshIndicator's
// displacement; max displacement = _kDragSizeFactorLimit * displacement.
@@ -471,7 +473,7 @@ class RefreshIndicatorState extends State<RefreshIndicator>
assert(_mode == _RefreshIndicatorMode.drag ||
_mode == _RefreshIndicatorMode.armed);
double newValue =
_dragOffset! / (containerExtent * _kDragContainerExtentPercentage);
_dragOffset! / (containerExtent * kDragContainerExtentPercentage);
if (_mode == _RefreshIndicatorMode.armed) {
newValue = math.max(newValue, 1.0 / _kDragSizeFactorLimit);
}

View File

@@ -1,6 +1,8 @@
import 'dart:io';
import 'dart:math';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart'
show kDragContainerExtentPercentage, displacement;
import 'package:PiliPlus/http/interceptor_anonymity.dart';
import 'package:PiliPlus/models/common/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart';
@@ -161,7 +163,7 @@ List<SettingsModel> get styleSettings => [
);
});
if (result != null) {
GStorage.setting.put(SettingBoxKey.maxRowWidth, result);
await GStorage.setting.put(SettingBoxKey.maxRowWidth, result);
SmartDialog.showToast('重启生效');
setState();
}
@@ -208,7 +210,8 @@ List<SettingsModel> get styleSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.upPanelPosition, result.index);
await GStorage.setting
.put(SettingBoxKey.upPanelPosition, result.index);
SmartDialog.showToast('重启生效');
setState();
}
@@ -238,13 +241,14 @@ List<SettingsModel> get styleSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.dynamicBadgeMode, result.index);
MainController mainController = Get.put(MainController());
mainController.dynamicBadgeMode =
DynamicBadgeMode.values[result.index];
if (mainController.dynamicBadgeMode != DynamicBadgeMode.hidden) {
mainController.getUnreadDynamic();
}
await GStorage.setting
.put(SettingBoxKey.dynamicBadgeMode, result.index);
SmartDialog.showToast('设置成功');
setState();
}
@@ -269,7 +273,6 @@ List<SettingsModel> get styleSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.msgBadgeMode, result.index);
MainController mainController = Get.put(MainController());
mainController.msgBadgeMode = DynamicBadgeMode.values[result.index];
if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) {
@@ -277,6 +280,8 @@ List<SettingsModel> get styleSettings => [
} else {
mainController.msgUnReadCount.value = '';
}
await GStorage.setting
.put(SettingBoxKey.msgBadgeMode, result.index);
SmartDialog.showToast('设置成功');
setState();
}
@@ -301,13 +306,13 @@ List<SettingsModel> get styleSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.msgUnReadTypeV2,
result.map((item) => item.index).toList()..sort());
MainController mainController = Get.put(MainController());
mainController.msgUnReadTypes = result;
if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) {
mainController.queryUnreadMsg();
}
await GStorage.setting.put(SettingBoxKey.msgUnReadTypeV2,
result.map((item) => item.index).toList()..sort());
SmartDialog.showToast('设置成功');
setState();
}
@@ -342,9 +347,10 @@ List<SettingsModel> get styleSettings => [
context: Get.context!,
title: '图片质量',
initValue: GStorage.picQuality,
callback: (picQuality) {
GStorage.setting.put(SettingBoxKey.defaultPicQa, picQuality);
callback: (picQuality) async {
GlobalData().imgQuality = picQuality;
await GStorage.setting
.put(SettingBoxKey.defaultPicQa, picQuality);
setState();
},
);
@@ -368,8 +374,9 @@ List<SettingsModel> get styleSettings => [
context: Get.context!,
title: '查看大图质量',
initValue: GStorage.previewQ,
callback: (picQuality) {
GStorage.setting.put(SettingBoxKey.previewQuality, picQuality);
callback: (picQuality) async {
await GStorage.setting
.put(SettingBoxKey.previewQuality, picQuality);
setState();
},
);
@@ -401,8 +408,8 @@ List<SettingsModel> get styleSettings => [
},
);
if (result != null) {
await GStorage.setting.put(SettingBoxKey.defaultToastOp, result);
SmartDialog.showToast('设置成功');
GStorage.setting.put(SettingBoxKey.defaultToastOp, result);
setState();
}
},
@@ -467,7 +474,7 @@ List<SettingsModel> get styleSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultHomePage, result);
await GStorage.setting.put(SettingBoxKey.defaultHomePage, result);
SmartDialog.showToast('设置成功,重启生效');
setState();
}
@@ -619,7 +626,8 @@ List<SettingsModel> get playSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.subtitlePreference, result);
await GStorage.setting
.put(SettingBoxKey.subtitlePreference, result);
setState();
}
},
@@ -730,7 +738,7 @@ List<SettingsModel> get playSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.fullScreenMode, result);
await GStorage.setting.put(SettingBoxKey.fullScreenMode, result);
setState();
}
},
@@ -754,7 +762,8 @@ List<SettingsModel> get playSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.btmProgressBehavior, result);
await GStorage.setting
.put(SettingBoxKey.btmProgressBehavior, result);
setState();
}
},
@@ -826,7 +835,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.CDNService, result);
await GStorage.setting.put(SettingBoxKey.CDNService, result);
setState();
}
},
@@ -867,7 +876,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultVideoQa, result);
await GStorage.setting.put(SettingBoxKey.defaultVideoQa, result);
setState();
}
},
@@ -892,7 +901,8 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultVideoQaCellular, result);
await GStorage.setting
.put(SettingBoxKey.defaultVideoQaCellular, result);
setState();
}
},
@@ -917,7 +927,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultAudioQa, result);
await GStorage.setting.put(SettingBoxKey.defaultAudioQa, result);
setState();
}
},
@@ -942,7 +952,8 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultAudioQaCellular, result);
await GStorage.setting
.put(SettingBoxKey.defaultAudioQaCellular, result);
setState();
}
},
@@ -966,7 +977,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultDecode, result);
await GStorage.setting.put(SettingBoxKey.defaultDecode, result);
setState();
}
},
@@ -990,7 +1001,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.secondDecode, result);
await GStorage.setting.put(SettingBoxKey.secondDecode, result);
setState();
}
},
@@ -1042,7 +1053,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.videoSync, result);
await GStorage.setting.put(SettingBoxKey.videoSync, result);
setState();
}
},
@@ -1066,7 +1077,7 @@ List<SettingsModel> get videoSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.hardwareDecoding, result);
await GStorage.setting.put(SettingBoxKey.hardwareDecoding, result);
setState();
}
},
@@ -1098,7 +1109,7 @@ List<SettingsModel> get recommendSettings => [
SmartDialog.showToast('尚未登录,无法收到个性化推荐');
}
}
GStorage.setting.put(SettingBoxKey.defaultRcmdType, result);
await GStorage.setting.put(SettingBoxKey.defaultRcmdType, result);
SmartDialog.showToast('下次启动时生效');
setState();
}
@@ -1168,7 +1179,7 @@ List<SettingsModel> get recommendSettings => [
},
);
if (result != null) {
GStorage.setting
await GStorage.setting
.put(SettingBoxKey.minLikeRatioForRecommend, result);
RecommendFilter.update();
setState();
@@ -1215,8 +1226,9 @@ List<SettingsModel> get recommendSettings => [
},
);
if (result != null) {
void updateDuration(int value) {
GStorage.setting.put(SettingBoxKey.minDurationForRcmd, value);
void updateDuration(int value) async {
await GStorage.setting
.put(SettingBoxKey.minDurationForRcmd, value);
RecommendFilter.update();
setState();
}
@@ -1652,6 +1664,63 @@ List<SettingsModel> get extraSettings => [
setKey: SettingBoxKey.openInBrowser,
defaultVal: false,
),
SettingsModel(
settingsType: SettingsType.normal,
title: '刷新滑动距离',
leading: Icon(Icons.refresh),
setKey: SettingBoxKey.refreshDragPercentage,
getSubtitle: () => '当前滑动距离: ${GStorage.refreshDragPercentage}x',
onTap: (setState) async {
double? result = await showDialog(
context: Get.context!,
builder: (context) {
return SlideDialog<double>(
title: '刷新滑动距离',
min: 0.1,
max: 0.5,
divisions: 8,
precise: 2,
value: GStorage.refreshDragPercentage,
);
},
);
if (result != null) {
kDragContainerExtentPercentage = result;
await GStorage.setting
.put(SettingBoxKey.refreshDragPercentage, result);
Get.forceAppUpdate();
setState();
}
},
),
SettingsModel(
settingsType: SettingsType.normal,
title: '刷新指示器高度',
leading: Icon(Icons.height),
setKey: SettingBoxKey.refreshDisplacement,
getSubtitle: () => '当前指示器高度: ${GStorage.refreshDisplacement}',
onTap: (setState) async {
double? result = await showDialog(
context: Get.context!,
builder: (context) {
return SlideDialog<double>(
title: '刷新指示器高度',
min: 10.0,
max: 100.0,
divisions: 9,
value: GStorage.refreshDisplacement,
);
},
);
if (result != null) {
displacement = result;
await GStorage.setting
.put(SettingBoxKey.refreshDisplacement, result);
Get.forceAppUpdate();
setState();
}
},
),
SettingsModel(
settingsType: SettingsType.sw1tch,
enableFeedback: true,
@@ -1743,7 +1812,7 @@ List<SettingsModel> get extraSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.replySortType, result);
await GStorage.setting.put(SettingBoxKey.replySortType, result);
setState();
}
},
@@ -1768,7 +1837,8 @@ List<SettingsModel> get extraSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.defaultDynamicType, result);
await GStorage.setting
.put(SettingBoxKey.defaultDynamicType, result);
setState();
}
},
@@ -1792,7 +1862,7 @@ List<SettingsModel> get extraSettings => [
},
);
if (result != null) {
GStorage.setting.put(SettingBoxKey.memberTab, result.index);
await GStorage.setting.put(SettingBoxKey.memberTab, result.index);
setState();
}
},
@@ -1950,10 +2020,7 @@ SettingsModel getBanwordModel({
child: const Text('保存'),
onPressed: () async {
Get.back();
await GStorage.setting.put(
key,
banWord,
);
await GStorage.setting.put(key, banWord);
setState();
SmartDialog.showToast('已保存');
},

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
// import 'package:PiliPlus/models/common/theme_type.dart';
import 'package:get/get_utils/get_utils.dart';
class SlideDialog<T extends num> extends StatefulWidget {
final T value;
@@ -8,6 +8,7 @@ class SlideDialog<T extends num> extends StatefulWidget {
final double max;
final int? divisions;
final String? suffix;
final int precise;
const SlideDialog({
super.key,
@@ -17,6 +18,7 @@ class SlideDialog<T extends num> extends StatefulWidget {
required this.max,
this.divisions,
this.suffix,
this.precise = 1,
});
@override
@@ -47,11 +49,11 @@ class _SlideDialogState<T extends num> extends State<SlideDialog<T>> {
value: _tempValue,
min: widget.min,
max: widget.max,
divisions: widget.divisions ?? 10,
divisions: widget.divisions,
label: '$_tempValue${widget.suffix ?? ''}',
onChanged: (double value) {
setState(() {
_tempValue = value;
_tempValue = value.toPrecision(widget.precise);
});
},
),

View File

@@ -1,6 +1,8 @@
import 'dart:convert';
import 'dart:io';
import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart'
show kDragContainerExtentPercentage, displacement;
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/models/common/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/tab_type.dart';
@@ -212,6 +214,12 @@ class GStorage {
static double get blockLimit =>
setting.get(SettingBoxKey.blockLimit, defaultValue: 0.0);
static double get refreshDragPercentage =>
setting.get(SettingBoxKey.refreshDragPercentage, defaultValue: 0.25);
static double get refreshDisplacement =>
setting.get(SettingBoxKey.refreshDisplacement, defaultValue: 40.0);
static String get blockUserID {
String blockUserID =
setting.get(SettingBoxKey.blockUserID, defaultValue: '');
@@ -390,6 +398,8 @@ class GStorage {
);
// 视频设置
video = await Hive.openBox('video');
displacement = GStorage.refreshDisplacement;
kDragContainerExtentPercentage = GStorage.refreshDragPercentage;
// 设置全局变量
GlobalData()
..imgQuality = defaultPicQa
@@ -538,6 +548,8 @@ class SettingBoxKey {
banWordForZone = 'banWordForZone',
savedRcmdTip = 'savedRcmdTip',
openInBrowser = 'openInBrowser',
refreshDragPercentage = 'refreshDragPercentage',
refreshDisplacement = 'refreshDisplacement',
// Sponsor Block
enableSponsorBlock = 'enableSponsorBlock',