refa: settings page

This commit is contained in:
My-Responsitories
2026-06-23 22:07:35 +08:00
parent fa69955b76
commit cd3b0547a2
10 changed files with 64 additions and 246 deletions

View File

@@ -1,3 +1,11 @@
import 'package:PiliPlus/pages/setting/models/extra_settings.dart';
import 'package:PiliPlus/pages/setting/models/model.dart';
import 'package:PiliPlus/pages/setting/models/play_settings.dart';
import 'package:PiliPlus/pages/setting/models/privacy_settings.dart';
import 'package:PiliPlus/pages/setting/models/recommend_settings.dart';
import 'package:PiliPlus/pages/setting/models/style_settings.dart';
import 'package:PiliPlus/pages/setting/models/video_settings.dart';
enum SettingType {
privacySetting('隐私设置'),
recommendSetting('推荐流设置'),
@@ -11,4 +19,14 @@ enum SettingType {
final String title;
const SettingType(this.title);
List<SettingsModel> get settings => switch (this) {
.privacySetting => privacySettings,
.recommendSetting => recommendSettings,
.videoSetting => videoSettings,
.playSetting => playSettings,
.styleSetting => styleSettings,
.extraSetting => extraSettings,
_ => throw UnimplementedError(),
};
}

View File

@@ -1,25 +1,29 @@
import 'package:PiliPlus/pages/setting/models/extra_settings.dart';
import 'package:PiliPlus/models/common/setting_type.dart';
import 'package:flutter/material.dart';
class ExtraSetting extends StatefulWidget {
const ExtraSetting({super.key, this.showAppBar = true});
class CommonSetting extends StatefulWidget {
const CommonSetting({
super.key,
required this.settingType,
this.showAppBar = true,
});
final bool showAppBar;
final SettingType settingType;
@override
State<ExtraSetting> createState() => _ExtraSettingState();
State<CommonSetting> createState() => _CommonSettingState();
}
class _ExtraSettingState extends State<ExtraSetting> {
final settings = extraSettings;
class _CommonSettingState extends State<CommonSetting> {
@override
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final settings = widget.settingType.settings;
final padding = MediaQuery.viewPaddingOf(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: showAppBar ? AppBar(title: const Text('其它设置')) : null,
appBar: showAppBar ? AppBar(title: Text(widget.settingType.title)) : null,
body: ListView.builder(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,

View File

@@ -93,8 +93,8 @@ List<SettingsModel> get recommendSettings => [
onChanged: (value) => RecommendFilter.exemptFilterForFollowed = value,
),
SwitchModel(
title: '过滤器也应用于相关视频',
subtitle: '视频详情页的相关视频也进行过滤¹',
title: '过滤器也应用于详情页相关视频',
subtitle: '其它如热门视频、搜索等均不受过滤器影响无法豁免相关视频中的已关注UP',
leading: const Icon(Icons.explore_outlined),
setKey: SettingBoxKey.applyFilterToRelatedVideos,
defaultVal: true,

View File

@@ -1,34 +0,0 @@
import 'package:PiliPlus/pages/setting/models/play_settings.dart';
import 'package:flutter/material.dart';
class PlaySetting extends StatefulWidget {
const PlaySetting({super.key, this.showAppBar = true});
final bool showAppBar;
@override
State<PlaySetting> createState() => _PlaySettingState();
}
class _PlaySettingState extends State<PlaySetting> {
final settings = playSettings;
@override
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final padding = MediaQuery.viewPaddingOf(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: showAppBar ? AppBar(title: const Text('播放器设置')) : null,
body: ListView.builder(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,
bottom: padding.bottom + 100,
),
itemCount: settings.length,
itemBuilder: (context, index) => settings[index].widget,
),
);
}
}

View File

@@ -1,33 +0,0 @@
import 'package:PiliPlus/pages/setting/models/privacy_settings.dart';
import 'package:flutter/material.dart';
class PrivacySetting extends StatefulWidget {
const PrivacySetting({super.key, this.showAppBar = true});
final bool showAppBar;
@override
State<PrivacySetting> createState() => _PrivacySettingState();
}
class _PrivacySettingState extends State<PrivacySetting> {
final settings = privacySettings;
@override
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final padding = MediaQuery.viewPaddingOf(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: showAppBar ? AppBar(title: const Text('隐私设置')) : null,
body: ListView(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,
bottom: padding.bottom + 100,
),
children: settings.map((item) => item.widget).toList(),
),
);
}
}

View File

@@ -1,51 +0,0 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/pages/setting/models/recommend_settings.dart';
import 'package:flutter/material.dart' hide ListTile;
class RecommendSetting extends StatefulWidget {
const RecommendSetting({super.key, this.showAppBar = true});
final bool showAppBar;
@override
State<RecommendSetting> createState() => _RecommendSettingState();
}
class _RecommendSettingState extends State<RecommendSetting> {
final list = recommendSettings;
@override
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final padding = MediaQuery.viewPaddingOf(context);
final theme = Theme.of(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: widget.showAppBar ? AppBar(title: const Text('推荐流设置')) : null,
body: ListView(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,
bottom: padding.bottom + 100,
),
children: [
...list.take(4).map((item) => item.widget),
const Divider(height: 1),
...list.skip(4).map((item) => item.widget),
ListTile(
dense: true,
subtitle: Text(
'¹ 由于接口未提供关注信息无法豁免相关视频中的已关注Up。\n\n'
'* 其它(如热门视频、手动搜索、链接跳转等)均不受过滤器影响。\n'
'* 设定较严苛的条件可导致推荐项数锐减或多次请求,请酌情选择。\n'
'* 后续可能会增加更多过滤条件,敬请期待。',
style: theme.textTheme.labelSmall!.copyWith(
color: theme.colorScheme.outline.withValues(alpha: 0.7),
),
),
),
],
),
);
}
}

View File

@@ -1,34 +0,0 @@
import 'package:PiliPlus/pages/setting/models/style_settings.dart';
import 'package:flutter/material.dart';
class StyleSetting extends StatefulWidget {
const StyleSetting({super.key, this.showAppBar = true});
final bool showAppBar;
@override
State<StyleSetting> createState() => _StyleSettingState();
}
class _StyleSettingState extends State<StyleSetting> {
final settings = styleSettings;
@override
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final padding = MediaQuery.viewPaddingOf(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: showAppBar ? AppBar(title: const Text('外观设置')) : null,
body: ListView.builder(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,
bottom: padding.bottom + 100,
),
itemCount: settings.length,
itemBuilder: (context, index) => settings[index].widget,
),
);
}
}

View File

@@ -1,34 +0,0 @@
import 'package:PiliPlus/pages/setting/models/video_settings.dart';
import 'package:flutter/material.dart';
class VideoSetting extends StatefulWidget {
const VideoSetting({super.key, this.showAppBar = true});
final bool showAppBar;
@override
State<VideoSetting> createState() => _VideoSettingState();
}
class _VideoSettingState extends State<VideoSetting> {
final settings = videoSettings;
@override
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final padding = MediaQuery.viewPaddingOf(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: showAppBar ? AppBar(title: const Text('音视频设置')) : null,
body: ListView.builder(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,
bottom: padding.bottom + 100,
),
itemCount: settings.length,
itemBuilder: (context, index) => settings[index].widget,
),
);
}
}

View File

@@ -4,12 +4,7 @@ import 'package:PiliPlus/http/login.dart';
import 'package:PiliPlus/models/common/setting_type.dart';
import 'package:PiliPlus/pages/about/view.dart';
import 'package:PiliPlus/pages/login/controller.dart';
import 'package:PiliPlus/pages/setting/extra_setting.dart';
import 'package:PiliPlus/pages/setting/play_setting.dart';
import 'package:PiliPlus/pages/setting/privacy_setting.dart';
import 'package:PiliPlus/pages/setting/recommend_setting.dart';
import 'package:PiliPlus/pages/setting/style_setting.dart';
import 'package:PiliPlus/pages/setting/video_setting.dart';
import 'package:PiliPlus/pages/setting/common_setting.dart';
import 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart';
import 'package:PiliPlus/pages/webdav/view.dart';
import 'package:PiliPlus/utils/accounts.dart';
@@ -43,6 +38,7 @@ class _SettingPageState extends State<SettingPage> {
late SettingType _type = SettingType.privacySetting;
final RxBool _noAccount = Accounts.account.isEmpty.obs;
late bool _isPortrait;
late ThemeData theme;
static const List<_SettingsModel> _items = [
_SettingsModel(
@@ -86,9 +82,15 @@ class _SettingPageState extends State<SettingPage> {
];
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
void didChangeDependencies() {
super.didChangeDependencies();
theme = Theme.of(context);
_isPortrait = MediaQuery.sizeOf(context).isPortrait;
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
@@ -111,28 +113,20 @@ class _SettingPageState extends State<SettingPage> {
Expanded(
flex: 6,
child: switch (_type) {
SettingType.privacySetting => const PrivacySetting(
.privacySetting ||
.recommendSetting ||
.videoSetting ||
.playSetting ||
.styleSetting ||
.extraSetting => CommonSetting(
key: ValueKey(_type),
settingType: _type,
showAppBar: false,
),
SettingType.recommendSetting => const RecommendSetting(
.webdavSetting => const WebDavSettingPage(
showAppBar: false,
),
SettingType.videoSetting => const VideoSetting(
showAppBar: false,
),
SettingType.playSetting => const PlaySetting(
showAppBar: false,
),
SettingType.styleSetting => const StyleSetting(
showAppBar: false,
),
SettingType.extraSetting => const ExtraSetting(
showAppBar: false,
),
SettingType.webdavSetting => const WebDavSettingPage(
showAppBar: false,
),
SettingType.about => const AboutPage(showAppBar: false),
.about => const AboutPage(showAppBar: false),
},
),
],
@@ -149,7 +143,18 @@ class _SettingPageState extends State<SettingPage> {
void _toPage(SettingType type) {
if (_isPortrait) {
Get.toNamed('/${type.name}');
Get.to(
() => switch (type) {
.privacySetting ||
.recommendSetting ||
.videoSetting ||
.playSetting ||
.styleSetting ||
.extraSetting => CommonSetting(settingType: type),
.webdavSetting => const WebDavSettingPage(),
.about => const AboutPage(),
},
);
} else {
_type = type;
setState(() {});

View File

@@ -1,4 +1,3 @@
import 'package:PiliPlus/pages/about/view.dart';
import 'package:PiliPlus/pages/article/view.dart';
import 'package:PiliPlus/pages/article_list/view.dart';
import 'package:PiliPlus/pages/audio/view.dart';
@@ -53,18 +52,12 @@ import 'package:PiliPlus/pages/popular_series/view.dart';
import 'package:PiliPlus/pages/search/view.dart';
import 'package:PiliPlus/pages/search_result/view.dart';
import 'package:PiliPlus/pages/search_trending/view.dart';
import 'package:PiliPlus/pages/setting/extra_setting.dart';
import 'package:PiliPlus/pages/setting/pages/bar_set.dart';
import 'package:PiliPlus/pages/setting/pages/color_select.dart';
import 'package:PiliPlus/pages/setting/pages/display_mode.dart';
import 'package:PiliPlus/pages/setting/pages/font_size_select.dart';
import 'package:PiliPlus/pages/setting/pages/logs.dart';
import 'package:PiliPlus/pages/setting/pages/play_speed_set.dart';
import 'package:PiliPlus/pages/setting/play_setting.dart';
import 'package:PiliPlus/pages/setting/privacy_setting.dart';
import 'package:PiliPlus/pages/setting/recommend_setting.dart';
import 'package:PiliPlus/pages/setting/style_setting.dart';
import 'package:PiliPlus/pages/setting/video_setting.dart';
import 'package:PiliPlus/pages/setting/view.dart';
import 'package:PiliPlus/pages/settings_search/view.dart';
import 'package:PiliPlus/pages/space_setting/view.dart';
@@ -72,7 +65,6 @@ import 'package:PiliPlus/pages/sponsor_block/view.dart';
import 'package:PiliPlus/pages/subscription/view.dart';
import 'package:PiliPlus/pages/subscription_detail/view.dart';
import 'package:PiliPlus/pages/video/view.dart';
import 'package:PiliPlus/pages/webdav/view.dart';
import 'package:PiliPlus/pages/webview/view.dart';
import 'package:PiliPlus/pages/whisper/view.dart';
import 'package:PiliPlus/pages/whisper_detail/view.dart';
@@ -116,26 +108,12 @@ class Routes {
// 用户中心
GetPage(name: '/member', page: () => const MemberPage()),
GetPage(name: '/memberSearch', page: () => const MemberSearchPage()),
// 推荐流设置
GetPage(name: '/recommendSetting', page: () => const RecommendSetting()),
// 音视频设置
GetPage(name: '/videoSetting', page: () => const VideoSetting()),
// 播放器设置
GetPage(name: '/playSetting', page: () => const PlaySetting()),
// 外观设置
GetPage(name: '/styleSetting', page: () => const StyleSetting()),
// 隐私设置
GetPage(name: '/privacySetting', page: () => const PrivacySetting()),
// 其它设置
GetPage(name: '/extraSetting', page: () => const ExtraSetting()),
//
GetPage(name: '/blackListPage', page: () => const BlackListPage()),
GetPage(name: '/colorSetting', page: () => const ColorSelectPage()),
GetPage(name: '/fontSizeSetting', page: () => const FontSizeSelectPage()),
// 屏幕帧率
GetPage(name: '/displayModeSetting', page: () => const SetDisplayMode()),
// 关于
GetPage(name: '/about', page: () => const AboutPage()),
//
GetPage(name: '/articlePage', page: () => const ArticlePage()),
@@ -174,7 +152,6 @@ class Routes {
GetPage(name: '/createFav', page: () => const CreateFavPage()),
GetPage(name: '/editProfile', page: () => const EditProfilePage()),
GetPage(name: '/settingsSearch', page: () => const SettingsSearchPage()),
GetPage(name: '/webdavSetting', page: () => const WebDavSettingPage()),
GetPage(name: '/searchTrending', page: () => const SearchTrendingPage()),
GetPage(name: '/dynTopic', page: () => const DynTopicPage()),
GetPage(name: '/articleList', page: () => const ArticleListPage()),