mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-29 05:40:17 +08:00
refa: settings page
This commit is contained in:
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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(() {});
|
||||
|
||||
@@ -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()),
|
||||
|
||||
Reference in New Issue
Block a user