From 80b39daaff4fbaa122b71f387ab0c1cfaadca0d9 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 4 Feb 2024 22:06:45 +0800 Subject: [PATCH 1/5] =?UTF-8?q?mod:=20jumpUrl=E5=A2=9E=E5=8A=A0icon?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=20issues=20#471?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/reply/widgets/reply_item.dart | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/lib/pages/video/detail/reply/widgets/reply_item.dart b/lib/pages/video/detail/reply/widgets/reply_item.dart index 5e5a5828..7991a366 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item.dart @@ -571,7 +571,8 @@ InlineSpan buildContent( }); } // content.message = content.message.replaceAll(RegExp(r"\{vote:.*?\}"), ' '); - content.message = content.message.replaceAll('&', '&') + content.message = content.message + .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') @@ -586,21 +587,21 @@ InlineSpan buildContent( e.replaceAll('?', '\\?').replaceAll('+', '\\+').replaceAll('*', '\\*')), ]; - String patternStr = - specialTokens.map(RegExp.escape).join('|'); + String patternStr = specialTokens.map(RegExp.escape).join('|'); if (patternStr.isNotEmpty) { patternStr += "|"; } patternStr += r'(\b\d{1,2}[::]\d{2}\b)'; final RegExp pattern = RegExp(patternStr); List matchedStrs = []; - void addPlainTextSpan(str){ + void addPlainTextSpan(str) { spanChilds.add(TextSpan( text: str, recognizer: TapGestureRecognizer() - ..onTap = () => - replyReply(replyItem.root == 0 ? replyItem : fReplyItem))); + ..onTap = + () => replyReply(replyItem.root == 0 ? replyItem : fReplyItem))); } + // 分割文本并处理每个部分 content.message.splitMapJoin( pattern, @@ -674,57 +675,56 @@ InlineSpan buildContent( addPlainTextSpan(matchStr); return ""; } - spanChilds.add( - TextSpan( - text: content.jumpUrl[matchStr]['title'], - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - if (appUrlSchema == '') { - final String str = Uri.parse(matchStr).pathSegments[0]; - final Map matchRes = IdUtils.matchAvorBv(input: str); - final List matchKeys = matchRes.keys.toList(); - if (matchKeys.isNotEmpty) { - if (matchKeys.first == 'BV') { + spanChilds.addAll( + [ + if (content.jumpUrl[matchStr]?['prefix_icon'] != null) ...[ + WidgetSpan( + child: Image.network( + content.jumpUrl[matchStr]['prefix_icon'], + height: 19, + color: Theme.of(context).colorScheme.primary, + ), + ) + ], + TextSpan( + text: content.jumpUrl[matchStr]['title'], + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + if (appUrlSchema == '') { + final String str = Uri.parse(matchStr).pathSegments[0]; + final Map matchRes = IdUtils.matchAvorBv(input: str); + final List matchKeys = matchRes.keys.toList(); + if (matchKeys.isNotEmpty) { + if (matchKeys.first == 'BV') { + Get.toNamed( + '/searchResult', + parameters: {'keyword': matchRes['BV']}, + ); + } + } else { Get.toNamed( - '/searchResult', - parameters: {'keyword': matchRes['BV']}, + '/webview', + parameters: { + 'url': matchStr, + 'type': 'url', + 'pageTitle': '' + }, ); } } else { - Get.toNamed( - '/webview', - parameters: { - 'url': matchStr, - 'type': 'url', - 'pageTitle': '' - }, - ); + if (appUrlSchema.startsWith('bilibili://search')) { + Get.toNamed('/searchResult', parameters: { + 'keyword': content.jumpUrl[matchStr]['title'] + }); + } } - } else { - if (appUrlSchema.startsWith('bilibili://search')) { - Get.toNamed('/searchResult', parameters: { - 'keyword': content.jumpUrl[matchStr]['title'] - }); - } - } - }, - ), + }, + ) + ], ); - if (appUrlSchema.startsWith('bilibili://search')) { - spanChilds.add( - WidgetSpan( - child: Icon( - FontAwesomeIcons.magnifyingGlass, - size: 9, - color: Theme.of(context).colorScheme.primary, - ), - alignment: PlaceholderAlignment.top, - ), - ); - } // 只显示一次 matchedStrs.add(matchStr); } else { From a560d66567891afc376a03acf95013fcc8fa8d40 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 4 Feb 2024 23:03:24 +0800 Subject: [PATCH 2/5] mod: rcmd FutureBuilder --- lib/models/common/rcmd_type.dart | 2 +- lib/pages/rcmd/controller.dart | 7 +++-- lib/pages/rcmd/view.dart | 53 +++++++++++++++++++++++--------- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/lib/models/common/rcmd_type.dart b/lib/models/common/rcmd_type.dart index 5af18d77..2dfdad1c 100644 --- a/lib/models/common/rcmd_type.dart +++ b/lib/models/common/rcmd_type.dart @@ -3,5 +3,5 @@ enum RcmdType { web, app, notLogin } extension RcmdTypeExtension on RcmdType { String get values => ['web', 'app', 'notLogin'][index]; - String get labels => ['web端', 'app端', '模拟未登录'][index]; + String get labels => ['web端', 'app端', '游客模式'][index]; } diff --git a/lib/pages/rcmd/controller.dart b/lib/pages/rcmd/controller.dart index 6ecc9d63..b7e58f44 100644 --- a/lib/pages/rcmd/controller.dart +++ b/lib/pages/rcmd/controller.dart @@ -28,7 +28,7 @@ class RcmdController extends GetxController { setting.get(SettingBoxKey.enableSaveLastData, defaultValue: false); defaultRcmdType = setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web'); - if (defaultRcmdType == 'web'){ + if (defaultRcmdType == 'web') { videoList = [].obs; } else { videoList = [].obs; @@ -43,7 +43,7 @@ class RcmdController extends GetxController { if (type == 'onRefresh') { _currentPage = 0; } - late final Map res; + late final Map res; switch (defaultRcmdType) { case 'app': case 'notLogin': @@ -77,13 +77,14 @@ class RcmdController extends GetxController { _currentPage += 1; // 若videoList数量太小,可能会影响翻页,此时再次请求 // 为避免请求到的数据太少时还在反复请求,要求本次返回数据大于1条才触发 - if (res['data'].length > 1 && videoList.length < 10){ + if (res['data'].length > 1 && videoList.length < 10) { queryRcmdFeed('onLoad'); } } else { Get.snackbar('提示', res['msg']); } isLoadingMore = false; + return res; } // 下拉刷新 diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 687eacd1..42b66364 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -7,7 +7,7 @@ import 'package:get/get.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/skeleton/video_card_v.dart'; import 'package:pilipala/common/widgets/animated_dialog.dart'; -// import 'package:pilipala/common/widgets/http_error.dart'; +import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/overlay_pop.dart'; import 'package:pilipala/common/widgets/video_card_v.dart'; import 'package:pilipala/pages/home/index.dart'; @@ -25,6 +25,7 @@ class RcmdPage extends StatefulWidget { class _RcmdPageState extends State with AutomaticKeepAliveClientMixin { final RcmdController _rcmdController = Get.put(RcmdController()); + late Future _futureBuilderFuture; @override bool get wantKeepAlive => true; @@ -32,7 +33,7 @@ class _RcmdPageState extends State @override void initState() { super.initState(); - _rcmdController.queryRcmdFeed('init'); + _futureBuilderFuture = _rcmdController.queryRcmdFeed('init'); ScrollController scrollController = _rcmdController.scrollController; StreamController mainStream = Get.find().bottomBarStream; @@ -88,19 +89,41 @@ class _RcmdPageState extends State slivers: [ SliverPadding( padding: - const EdgeInsets.fromLTRB(0, StyleString.safeSpace, 0, 0), - sliver: Obx(() { // 使用Obx来监听数据的变化 - if (_rcmdController.isLoadingMore && _rcmdController.videoList.isEmpty) { - return contentGrid(_rcmdController, []); - // 如果正在加载并且列表为空,则显示加载指示器 - // return const SliverToBoxAdapter( - // child: Center(child: CircularProgressIndicator()), - // ); - } else { - // 显示视频列表 - return contentGrid(_rcmdController, _rcmdController.videoList); - } - }), + const EdgeInsets.fromLTRB(0, StyleString.safeSpace, 0, 0), + sliver: FutureBuilder( + future: _futureBuilderFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + Map data = snapshot.data as Map; + if (data['status']) { + return Obx( + () { + if (_rcmdController.isLoadingMore && + _rcmdController.videoList.isEmpty) { + return contentGrid(_rcmdController, []); + } else { + // 显示视频列表 + return contentGrid( + _rcmdController, _rcmdController.videoList); + } + }, + ); + } else { + return HttpError( + errMsg: data['msg'], + fn: () { + setState(() { + _futureBuilderFuture = + _rcmdController.queryRcmdFeed('init'); + }); + }, + ); + } + } else { + return contentGrid(_rcmdController, []); + } + }, + ), ), LoadingMore(ctr: _rcmdController), ], From 9e471b83d992755d23764c7e24228949c9b75cd4 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 5 Feb 2024 00:19:03 +0800 Subject: [PATCH 3/5] mod: cancel Get.snackbar --- lib/pages/rcmd/controller.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/pages/rcmd/controller.dart b/lib/pages/rcmd/controller.dart index b7e58f44..28ff055b 100644 --- a/lib/pages/rcmd/controller.dart +++ b/lib/pages/rcmd/controller.dart @@ -80,8 +80,6 @@ class RcmdController extends GetxController { if (res['data'].length > 1 && videoList.length < 10) { queryRcmdFeed('onLoad'); } - } else { - Get.snackbar('提示', res['msg']); } isLoadingMore = false; return res; From 78ade4a1936c47327e6b7d01648edf66b81e3f55 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 5 Feb 2024 23:41:40 +0800 Subject: [PATCH 4/5] =?UTF-8?q?mod:=20=E7=A7=BB=E9=99=A4=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E6=8C=89=E3=80=90=E6=9C=80=E5=A4=9A=E5=9B=9E=E5=A4=8D=E3=80=91?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=20issues=20#298?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/models/common/reply_sort_type.dart | 6 +++--- lib/pages/dynamics/detail/controller.dart | 7 ++++--- lib/pages/html/controller.dart | 3 --- lib/pages/setting/extra_setting.dart | 4 ++++ lib/pages/video/detail/reply/controller.dart | 9 +++++---- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/models/common/reply_sort_type.dart b/lib/models/common/reply_sort_type.dart index 7c203c13..89da82b3 100644 --- a/lib/models/common/reply_sort_type.dart +++ b/lib/models/common/reply_sort_type.dart @@ -1,6 +1,6 @@ -enum ReplySortType { time, like, reply } +enum ReplySortType { time, like } extension ReplySortTypeExtension on ReplySortType { - String get titles => ['最新评论', '最热评论', '回复最多'][index]; - String get labels => ['最新', '最热', '最多回复'][index]; + String get titles => ['最新评论', '最热评论'][index]; + String get labels => ['最新', '最热'][index]; } diff --git a/lib/pages/dynamics/detail/controller.dart b/lib/pages/dynamics/detail/controller.dart index 1520377e..4c5f35d6 100644 --- a/lib/pages/dynamics/detail/controller.dart +++ b/lib/pages/dynamics/detail/controller.dart @@ -37,6 +37,10 @@ class DynamicDetailController extends GetxController { } int deaultReplySortIndex = setting.get(SettingBoxKey.replySortType, defaultValue: 0); + if (deaultReplySortIndex == 2) { + setting.put(SettingBoxKey.replySortType, 0); + deaultReplySortIndex = 0; + } _sortType = ReplySortType.values[deaultReplySortIndex]; sortTypeTitle.value = _sortType.titles; sortTypeLabel.value = _sortType.labels; @@ -92,9 +96,6 @@ class DynamicDetailController extends GetxController { _sortType = ReplySortType.like; break; case ReplySortType.like: - _sortType = ReplySortType.reply; - break; - case ReplySortType.reply: _sortType = ReplySortType.time; break; default: diff --git a/lib/pages/html/controller.dart b/lib/pages/html/controller.dart index f3187828..1175ce29 100644 --- a/lib/pages/html/controller.dart +++ b/lib/pages/html/controller.dart @@ -96,9 +96,6 @@ class HtmlRenderController extends GetxController { _sortType = ReplySortType.like; break; case ReplySortType.like: - _sortType = ReplySortType.reply; - break; - case ReplySortType.reply: _sortType = ReplySortType.time; break; default: diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/extra_setting.dart index b32a06f5..1580ad8b 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/extra_setting.dart @@ -31,6 +31,10 @@ class _ExtraSettingState extends State { // 默认优先显示最新评论 defaultReplySort = setting.get(SettingBoxKey.replySortType, defaultValue: 0); + if (defaultReplySort == 2) { + setting.put(SettingBoxKey.replySortType, 0); + defaultReplySort = 0; + } // 优先展示全部动态 all defaultDynamicType = setting.get(SettingBoxKey.defaultDynamicType, defaultValue: 0); diff --git a/lib/pages/video/detail/reply/controller.dart b/lib/pages/video/detail/reply/controller.dart index 9e05542b..5781cbba 100644 --- a/lib/pages/video/detail/reply/controller.dart +++ b/lib/pages/video/detail/reply/controller.dart @@ -41,8 +41,12 @@ class VideoReplyController extends GetxController { @override void onInit() { super.onInit(); - final int deaultReplySortIndex = + int deaultReplySortIndex = setting.get(SettingBoxKey.replySortType, defaultValue: 0) as int; + if (deaultReplySortIndex == 2) { + setting.put(SettingBoxKey.replySortType, 0); + deaultReplySortIndex = 0; + } _sortType = ReplySortType.values[deaultReplySortIndex]; sortTypeTitle.value = _sortType.titles; sortTypeLabel.value = _sortType.labels; @@ -115,9 +119,6 @@ class VideoReplyController extends GetxController { _sortType = ReplySortType.like; break; case ReplySortType.like: - _sortType = ReplySortType.reply; - break; - case ReplySortType.reply: _sortType = ReplySortType.time; break; default: From 4a5f4ca2caaa34c7157db4241c410c98038bf3fc Mon Sep 17 00:00:00 2001 From: guozhigq Date: Tue, 6 Feb 2024 00:14:46 +0800 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=E9=99=90=E6=97=B6=E5=85=8D=E8=B4=B9?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=92=AD=E6=94=BE=20issues=20#457?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/bangumi/widgets/bangumi_panel.dart | 25 +++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/pages/bangumi/widgets/bangumi_panel.dart b/lib/pages/bangumi/widgets/bangumi_panel.dart index b5ec4efe..5996d6c8 100644 --- a/lib/pages/bangumi/widgets/bangumi_panel.dart +++ b/lib/pages/bangumi/widgets/bangumi_panel.dart @@ -151,7 +151,7 @@ class _BangumiPanelState extends State { } void changeFucCall(item, i) async { - if (item.badge != null && vipStatus != 1) { + if (item.badge != null && item.badge == '会员' && vipStatus != 1) { SmartDialog.showToast('需要大会员'); return; } @@ -255,11 +255,24 @@ class _BangumiPanelState extends State { ), const SizedBox(width: 2), if (widget.pages[i].badge != null) ...[ - Image.asset( - 'assets/images/big-vip.png', - height: 16, - ), - ], + if (widget.pages[i].badge == '会员') ...[ + Image.asset( + 'assets/images/big-vip.png', + height: 16, + ), + ], + if (widget.pages[i].badge != '会员') ...[ + const Spacer(), + Text( + widget.pages[i].badge!, + style: TextStyle( + fontSize: 11, + color: + Theme.of(context).colorScheme.primary, + ), + ), + ], + ] ], ), const SizedBox(height: 3),