diff --git a/lib/models/common/setting_type.dart b/lib/models/common/setting_type.dart index 366623f60..64abaa232 100644 --- a/lib/models/common/setting_type.dart +++ b/lib/models/common/setting_type.dart @@ -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 get settings => switch (this) { + .privacySetting => privacySettings, + .recommendSetting => recommendSettings, + .videoSetting => videoSettings, + .playSetting => playSettings, + .styleSetting => styleSettings, + .extraSetting => extraSettings, + _ => throw UnimplementedError(), + }; } diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/common_setting.dart similarity index 55% rename from lib/pages/setting/extra_setting.dart rename to lib/pages/setting/common_setting.dart index 0c6343e0c..7b0a3a436 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/common_setting.dart @@ -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 createState() => _ExtraSettingState(); + State createState() => _CommonSettingState(); } -class _ExtraSettingState extends State { - final settings = extraSettings; - +class _CommonSettingState extends State { @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, diff --git a/lib/pages/setting/models/recommend_settings.dart b/lib/pages/setting/models/recommend_settings.dart index 256d27468..84f4b584e 100644 --- a/lib/pages/setting/models/recommend_settings.dart +++ b/lib/pages/setting/models/recommend_settings.dart @@ -93,8 +93,8 @@ List get recommendSettings => [ onChanged: (value) => RecommendFilter.exemptFilterForFollowed = value, ), SwitchModel( - title: '过滤器也应用于相关视频', - subtitle: '视频详情页的相关视频也进行过滤¹', + title: '过滤器也应用于详情页相关视频', + subtitle: '其它(如热门视频、搜索等)均不受过滤器影响,无法豁免相关视频中的已关注UP', leading: const Icon(Icons.explore_outlined), setKey: SettingBoxKey.applyFilterToRelatedVideos, defaultVal: true, diff --git a/lib/pages/setting/play_setting.dart b/lib/pages/setting/play_setting.dart deleted file mode 100644 index 6c97855a5..000000000 --- a/lib/pages/setting/play_setting.dart +++ /dev/null @@ -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 createState() => _PlaySettingState(); -} - -class _PlaySettingState extends State { - 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, - ), - ); - } -} diff --git a/lib/pages/setting/privacy_setting.dart b/lib/pages/setting/privacy_setting.dart deleted file mode 100644 index f2ff30bb3..000000000 --- a/lib/pages/setting/privacy_setting.dart +++ /dev/null @@ -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 createState() => _PrivacySettingState(); -} - -class _PrivacySettingState extends State { - 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(), - ), - ); - } -} diff --git a/lib/pages/setting/recommend_setting.dart b/lib/pages/setting/recommend_setting.dart deleted file mode 100644 index d77315fe3..000000000 --- a/lib/pages/setting/recommend_setting.dart +++ /dev/null @@ -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 createState() => _RecommendSettingState(); -} - -class _RecommendSettingState extends State { - 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), - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/pages/setting/style_setting.dart b/lib/pages/setting/style_setting.dart deleted file mode 100644 index 1b13350d7..000000000 --- a/lib/pages/setting/style_setting.dart +++ /dev/null @@ -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 createState() => _StyleSettingState(); -} - -class _StyleSettingState extends State { - 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, - ), - ); - } -} diff --git a/lib/pages/setting/video_setting.dart b/lib/pages/setting/video_setting.dart deleted file mode 100644 index 495720aa6..000000000 --- a/lib/pages/setting/video_setting.dart +++ /dev/null @@ -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 createState() => _VideoSettingState(); -} - -class _VideoSettingState extends State { - 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, - ), - ); - } -} diff --git a/lib/pages/setting/view.dart b/lib/pages/setting/view.dart index 197652b57..28c5788cd 100644 --- a/lib/pages/setting/view.dart +++ b/lib/pages/setting/view.dart @@ -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 { 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 { ]; @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 { 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 { 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(() {}); diff --git a/lib/router/app_pages.dart b/lib/router/app_pages.dart index d26c3d522..1fd642e44 100644 --- a/lib/router/app_pages.dart +++ b/lib/router/app_pages.dart @@ -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()),