diff --git a/lib/common/widgets/custom_toast.dart b/lib/common/widgets/custom_toast.dart index 9cd3461d..64cf0da2 100644 --- a/lib/common/widgets/custom_toast.dart +++ b/lib/common/widgets/custom_toast.dart @@ -1,4 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:pilipala/utils/storage.dart'; + +Box setting = GStrorage.setting; class CustomToast extends StatelessWidget { final String msg; @@ -6,12 +10,17 @@ class CustomToast extends StatelessWidget { @override Widget build(BuildContext context) { + double toastOpacity = + setting.get(SettingBoxKey.defaultToastOp, defaultValue: 1.0); return Container( margin: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom + 30), padding: const EdgeInsets.symmetric(horizontal: 17, vertical: 10), decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primaryContainer, + color: Theme.of(context) + .colorScheme + .primaryContainer + .withOpacity(toastOpacity), borderRadius: BorderRadius.circular(20), ), child: Text( diff --git a/lib/pages/setting/controller.dart b/lib/pages/setting/controller.dart index 0e1505a5..afd14156 100644 --- a/lib/pages/setting/controller.dart +++ b/lib/pages/setting/controller.dart @@ -15,6 +15,7 @@ class SettingController extends GetxController { RxBool userLogin = false.obs; RxBool feedBackEnable = false.obs; + RxDouble toastOpacity = (1.0).obs; RxInt picQuality = 10.obs; Rx themeType = ThemeType.system.obs; var userInfo; @@ -26,6 +27,8 @@ class SettingController extends GetxController { userLogin.value = userInfo != null; feedBackEnable.value = setting.get(SettingBoxKey.feedBackEnable, defaultValue: false); + toastOpacity.value = + setting.get(SettingBoxKey.defaultToastOp, defaultValue: 1.0); picQuality.value = setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10); themeType.value = ThemeType.values[setting.get(SettingBoxKey.themeMode, diff --git a/lib/pages/setting/style_setting.dart b/lib/pages/setting/style_setting.dart index ed35193e..a4e39aa0 100644 --- a/lib/pages/setting/style_setting.dart +++ b/lib/pages/setting/style_setting.dart @@ -1,11 +1,13 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/models/common/theme_type.dart'; import 'package:pilipala/pages/setting/pages/color_select.dart'; import 'package:pilipala/pages/setting/widgets/select_dialog.dart'; +import 'package:pilipala/pages/setting/widgets/slide_dialog.dart'; import 'package:pilipala/utils/storage.dart'; import 'controller.dart'; @@ -25,6 +27,7 @@ class _StyleSettingState extends State { Box setting = GStrorage.setting; late int picQuality; + late double toastOpacity; late ThemeType _tempThemeValue; late dynamic defaultCustomRows; @@ -32,6 +35,7 @@ class _StyleSettingState extends State { void initState() { super.initState(); picQuality = setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10); + toastOpacity = setting.get(SettingBoxKey.defaultToastOp, defaultValue: 1.0); _tempThemeValue = settingController.themeType.value; defaultCustomRows = setting.get(SettingBoxKey.customRows, defaultValue: 2); } @@ -187,6 +191,30 @@ class _StyleSettingState extends State { ), ), ), + ListTile( + dense: false, + onTap: () async { + double? result = await showDialog( + context: context, + builder: (context) { + return SlideDialog( + title: 'Toast不透明度', + value: settingController.toastOpacity.value, + min: 0.0, + max: 1.0, + divisions: 10, + ); + }, + ); + if (result != null) { + settingController.toastOpacity.value = result; + SmartDialog.showToast('设置成功'); + setting.put(SettingBoxKey.defaultToastOp, result); + } + }, + title: Text('Toast不透明度', style: titleStyle), + subtitle: Text('自定义Toast不透明度', style: subTitleStyle), + ), ListTile( dense: false, onTap: () async { diff --git a/lib/pages/setting/widgets/slide_dialog.dart b/lib/pages/setting/widgets/slide_dialog.dart new file mode 100644 index 00000000..7fa6eeab --- /dev/null +++ b/lib/pages/setting/widgets/slide_dialog.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +// import 'package:pilipala/models/common/theme_type.dart'; + +class SlideDialog extends StatefulWidget { + final T value; + final String title; + final double min; + final double max; + final int? divisions; + final String? suffix; + + const SlideDialog({ + super.key, + required this.value, + required this.title, + required this.min, + required this.max, + this.divisions, + this.suffix, + }); + + @override + _SlideDialogState createState() => _SlideDialogState(); +} + +class _SlideDialogState extends State> { + late double _tempValue; + + @override + void initState() { + super.initState(); + _tempValue = widget.value.toDouble(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(widget.title), + contentPadding: + const EdgeInsets.only(top: 20, left: 8, right: 8, bottom: 8), + content: SizedBox( + height: 40, + child: Slider( + value: _tempValue, + min: widget.min, + max: widget.max, + divisions: widget.divisions ?? 10, + label: '$_tempValue${widget.suffix ?? ''}', + onChanged: (double value) { + setState(() { + _tempValue = value; + }); + }, + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text( + '取消', + style: TextStyle(color: Theme.of(context).colorScheme.outline), + ), + ), + TextButton( + onPressed: () => Navigator.pop(context, _tempValue as T), + child: const Text('确定'), + ) + ], + ); + } +} diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 7aec10d5..e3a50881 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -98,6 +98,7 @@ class SettingBoxKey { fullScreenMode = 'fullScreenMode', defaultDecode = 'defaultDecode', danmakuEnable = 'danmakuEnable', + defaultToastOp = 'defaultToastOp', defaultPicQa = 'defaultPicQa', enableHA = 'enableHA', enableOnlineTotal = 'enableOnlineTotal',