From 535cf69967419e23fc553456f0cd0218bbf615ac Mon Sep 17 00:00:00 2001 From: guozhigq Date: Thu, 24 Aug 2023 12:23:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=84=E8=AE=BA=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/dynamics/deatil/controller.dart | 24 ++++++---- lib/pages/setting/extra_setting.dart | 47 +++++++++++++++++++- lib/pages/video/detail/reply/controller.dart | 30 +++++++++---- lib/utils/storage.dart | 5 +++ 4 files changed, 88 insertions(+), 18 deletions(-) diff --git a/lib/pages/dynamics/deatil/controller.dart b/lib/pages/dynamics/deatil/controller.dart index c2e1abe5..96ab65a6 100644 --- a/lib/pages/dynamics/deatil/controller.dart +++ b/lib/pages/dynamics/deatil/controller.dart @@ -1,8 +1,10 @@ import 'package:get/get.dart'; +import 'package:hive/hive.dart'; import 'package:pilipala/http/reply.dart'; import 'package:pilipala/models/common/reply_sort_type.dart'; import 'package:pilipala/models/video/reply/item.dart'; import 'package:pilipala/utils/feed_back.dart'; +import 'package:pilipala/utils/storage.dart'; class DynamicDetailController extends GetxController { DynamicDetailController(this.oid, this.type); @@ -16,9 +18,10 @@ class DynamicDetailController extends GetxController { RxList replyList = [ReplyItemModel()].obs; RxInt acount = 0.obs; - ReplySortType sortType = ReplySortType.time; + ReplySortType _sortType = ReplySortType.time; RxString sortTypeTitle = ReplySortType.time.titles.obs; RxString sortTypeLabel = ReplySortType.time.labels.obs; + Box setting = GStrorage.setting; @override void onInit() { @@ -29,6 +32,11 @@ class DynamicDetailController extends GetxController { acount.value = int.parse(item!.modules!.moduleStat!.comment!.count ?? '0'); } + int deaultReplySortIndex = + setting.get(SettingBoxKey.replySortType, defaultValue: 0); + _sortType = ReplySortType.values[deaultReplySortIndex]; + sortTypeTitle.value = _sortType.titles; + sortTypeLabel.value = _sortType.labels; } Future queryReplyList({reqType = 'init'}) async { @@ -39,7 +47,7 @@ class DynamicDetailController extends GetxController { oid: oid!, pageNum: currentPage + 1, type: type!, - sort: sortType.index, + sort: _sortType.index, ); if (res['status']) { List replies = res['data'].replies; @@ -76,20 +84,20 @@ class DynamicDetailController extends GetxController { // 排序搜索评论 queryBySort() { feedBack(); - switch (sortType) { + switch (_sortType) { case ReplySortType.time: - sortType = ReplySortType.like; + _sortType = ReplySortType.like; break; case ReplySortType.like: - sortType = ReplySortType.reply; + _sortType = ReplySortType.reply; break; case ReplySortType.reply: - sortType = ReplySortType.time; + _sortType = ReplySortType.time; break; default: } - sortTypeTitle.value = sortType.titles; - sortTypeLabel.value = sortType.labels; + sortTypeTitle.value = _sortType.titles; + sortTypeLabel.value = _sortType.labels; replyList.clear(); queryReplyList(reqType: 'init'); } diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/extra_setting.dart index a46cefaf..44646bb5 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/extra_setting.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:pilipala/models/common/reply_sort_type.dart'; import 'package:pilipala/utils/storage.dart'; import 'widgets/switch_item.dart'; @@ -11,8 +13,24 @@ class ExtraSetting extends StatefulWidget { } class _ExtraSettingState extends State { + Box setting = GStrorage.setting; + late dynamic defaultReplySort; + + @override + void initState() { + super.initState(); + // 默认优先显示最新评论 + defaultReplySort = + setting.get(SettingBoxKey.replySortType, defaultValue: 0); + } + @override Widget build(BuildContext context) { + TextStyle titleStyle = Theme.of(context).textTheme.titleMedium!; + TextStyle subTitleStyle = Theme.of(context) + .textTheme + .labelMedium! + .copyWith(color: Theme.of(context).colorScheme.outline); return Scaffold( appBar: AppBar( centerTitle: false, @@ -23,8 +41,33 @@ class _ExtraSettingState extends State { ), ), body: ListView( - children: const [ - SetSwitchItem( + children: [ + ListTile( + dense: false, + title: Text('评论展示', style: titleStyle), + subtitle: Text( + '当前优先展示「${ReplySortType.values[defaultReplySort].titles}」', + style: subTitleStyle, + ), + trailing: PopupMenuButton( + initialValue: defaultReplySort, + icon: const Icon(Icons.more_vert_outlined, size: 22), + onSelected: (item) { + defaultReplySort = item; + setting.put(SettingBoxKey.replySortType, item); + setState(() {}); + }, + itemBuilder: (BuildContext context) => [ + for (var i in ReplySortType.values) ...[ + PopupMenuItem( + value: i.index, + child: Text(i.titles), + ), + ] + ], + ), + ), + const SetSwitchItem( title: '检查更新', subTitle: '每次启动时检查是否需要更新', setKey: SettingBoxKey.autoUpdate, diff --git a/lib/pages/video/detail/reply/controller.dart b/lib/pages/video/detail/reply/controller.dart index f855c1e3..07c8d526 100644 --- a/lib/pages/video/detail/reply/controller.dart +++ b/lib/pages/video/detail/reply/controller.dart @@ -1,11 +1,13 @@ import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:hive/hive.dart'; import 'package:pilipala/http/reply.dart'; import 'package:pilipala/models/common/reply_sort_type.dart'; import 'package:pilipala/models/common/reply_type.dart'; import 'package:pilipala/models/video/reply/item.dart'; import 'package:pilipala/utils/feed_back.dart'; +import 'package:pilipala/utils/storage.dart'; class VideoReplyController extends GetxController { VideoReplyController( @@ -29,10 +31,22 @@ class VideoReplyController extends GetxController { // 当前回复的回复 ReplyItemModel? currentReplyItem; - ReplySortType sortType = ReplySortType.time; + ReplySortType _sortType = ReplySortType.time; RxString sortTypeTitle = ReplySortType.time.titles.obs; RxString sortTypeLabel = ReplySortType.time.labels.obs; + Box setting = GStrorage.setting; + + @override + void onInit() { + super.onInit(); + int deaultReplySortIndex = + setting.get(SettingBoxKey.replySortType, defaultValue: 0); + _sortType = ReplySortType.values[deaultReplySortIndex]; + sortTypeTitle.value = _sortType.titles; + sortTypeLabel.value = _sortType.labels; + } + Future queryReplyList({type = 'init'}) async { isLoadingMore = true; if (type == 'init') { @@ -46,7 +60,7 @@ class VideoReplyController extends GetxController { pageNum: currentPage + 1, ps: ps, type: ReplyType.video.index, - sort: sortType.index, + sort: _sortType.index, ); if (res['status']) { List replies = res['data'].replies; @@ -95,20 +109,20 @@ class VideoReplyController extends GetxController { queryBySort() { EasyThrottle.throttle('queryBySort', const Duration(seconds: 1), () { feedBack(); - switch (sortType) { + switch (_sortType) { case ReplySortType.time: - sortType = ReplySortType.like; + _sortType = ReplySortType.like; break; case ReplySortType.like: - sortType = ReplySortType.reply; + _sortType = ReplySortType.reply; break; case ReplySortType.reply: - sortType = ReplySortType.time; + _sortType = ReplySortType.time; break; default: } - sortTypeTitle.value = sortType.titles; - sortTypeLabel.value = sortType.labels; + sortTypeTitle.value = _sortType.titles; + sortTypeLabel.value = _sortType.labels; currentPage = 0; noMore.value = ''; replyList.clear(); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index c23ffb28..6f8d66ea 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -82,6 +82,7 @@ class GStrorage { } class SettingBoxKey { + /// 播放器 static const String btmProgressBehavior = 'btmProgressBehavior'; static const String defaultVideoSpeed = 'defaultVideoSpeed'; static const String autoUpgradeEnable = 'autoUpgradeEnable'; @@ -96,10 +97,14 @@ class SettingBoxKey { static const String enableHA = 'enableHA'; static const String enableOnlineTotal = 'enableOnlineTotal'; + /// 隐私 static const String blackMidsList = 'blackMidsList'; + /// 其他 static const String autoUpdate = 'autoUpdate'; + static const String replySortType = 'replySortType'; + /// 外观 static const String themeMode = 'themeMode'; static const String defaultTextScale = 'textScale'; static const String dynamicColor = 'dynamicColor'; // bool