Merge branch 'main' into fix
This commit is contained in:
3
.github/workflows/beta_ci.yml
vendored
3
.github/workflows/beta_ci.yml
vendored
@ -12,7 +12,6 @@ on:
|
|||||||
- ".idea/**"
|
- ".idea/**"
|
||||||
- "!.github/workflows/**"
|
- "!.github/workflows/**"
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update_version:
|
update_version:
|
||||||
name: Read and update version
|
name: Read and update version
|
||||||
@ -96,7 +95,7 @@ jobs:
|
|||||||
if: steps.cache-flutter.outputs.cache-hit != 'true'
|
if: steps.cache-flutter.outputs.cache-hit != 'true'
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: 3.16.5
|
flutter-version: 3.19.6
|
||||||
channel: any
|
channel: any
|
||||||
|
|
||||||
- name: 下载项目依赖
|
- name: 下载项目依赖
|
||||||
|
|||||||
4
.github/workflows/release_ci.yml
vendored
4
.github/workflows/release_ci.yml
vendored
@ -36,7 +36,7 @@ jobs:
|
|||||||
if: steps.cache-flutter.outputs.cache-hit != 'true'
|
if: steps.cache-flutter.outputs.cache-hit != 'true'
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: 3.16.5
|
flutter-version: 3.19.6
|
||||||
channel: any
|
channel: any
|
||||||
|
|
||||||
- name: 下载项目依赖
|
- name: 下载项目依赖
|
||||||
@ -98,7 +98,7 @@ jobs:
|
|||||||
uses: subosito/flutter-action@v2.10.0
|
uses: subosito/flutter-action@v2.10.0
|
||||||
with:
|
with:
|
||||||
cache: true
|
cache: true
|
||||||
flutter-version: 3.16.5
|
flutter-version: 3.19.6
|
||||||
|
|
||||||
- name: flutter build ipa
|
- name: flutter build ipa
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
39
change_log/1.0.25.1010.md
Normal file
39
change_log/1.0.25.1010.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
## 1.0.25
|
||||||
|
|
||||||
|
### 功能
|
||||||
|
+ 直播弹幕
|
||||||
|
+ 稍后再看、收藏夹播放全部
|
||||||
|
+ 收藏夹新建、编辑
|
||||||
|
+ 评论删除
|
||||||
|
+ 评论保存为图片
|
||||||
|
+ 动态页滑动切换up
|
||||||
|
+ up投稿筛选充电视频
|
||||||
|
+ 直播tab展示关注up
|
||||||
|
+ up主页专栏展示
|
||||||
|
|
||||||
|
### 优化
|
||||||
|
+ 视频详情页一键三连
|
||||||
|
+ 动态页标识充电视频
|
||||||
|
+ 播放器亮度、音量调整百分比展示
|
||||||
|
+ 封面预览时视频标题可复制
|
||||||
|
+ 竖屏直播布局
|
||||||
|
+ 图片预览
|
||||||
|
+ 专栏渲染优化
|
||||||
|
+ 私信图片查看
|
||||||
|
|
||||||
|
### 修复
|
||||||
|
+ 收藏夹点击异常
|
||||||
|
+ 搜索up异常
|
||||||
|
+ 系统通知已读异常
|
||||||
|
+ [赞了我的]展示错误
|
||||||
|
+ 部分up合集无法打开
|
||||||
|
+ 切换合集视频投币个数未重置
|
||||||
|
+ 搜索条件筛选面板无法滚动
|
||||||
|
+ 部分机型导航条未沉浸
|
||||||
|
+ 专栏图片渲染问题
|
||||||
|
+ 专栏浏览历史记录
|
||||||
|
+ 直播间历史记录
|
||||||
|
|
||||||
|
|
||||||
|
更多更新日志可在Github上查看
|
||||||
|
问题反馈、功能建议请查看「关于」页面。
|
||||||
@ -1,6 +1,7 @@
|
|||||||
class MediaVideoItemModel {
|
class MediaVideoItemModel {
|
||||||
MediaVideoItemModel({
|
MediaVideoItemModel({
|
||||||
this.id,
|
this.id,
|
||||||
|
this.aid,
|
||||||
this.offset,
|
this.offset,
|
||||||
this.index,
|
this.index,
|
||||||
this.intro,
|
this.intro,
|
||||||
@ -14,12 +15,13 @@ class MediaVideoItemModel {
|
|||||||
this.likeState,
|
this.likeState,
|
||||||
this.favState,
|
this.favState,
|
||||||
this.page,
|
this.page,
|
||||||
|
this.cid,
|
||||||
this.pages,
|
this.pages,
|
||||||
this.title,
|
this.title,
|
||||||
this.type,
|
this.type,
|
||||||
this.upper,
|
this.upper,
|
||||||
this.link,
|
this.link,
|
||||||
this.bvId,
|
this.bvid,
|
||||||
this.shortLink,
|
this.shortLink,
|
||||||
this.rights,
|
this.rights,
|
||||||
this.elecInfo,
|
this.elecInfo,
|
||||||
@ -32,6 +34,7 @@ class MediaVideoItemModel {
|
|||||||
});
|
});
|
||||||
|
|
||||||
int? id;
|
int? id;
|
||||||
|
int? aid;
|
||||||
int? offset;
|
int? offset;
|
||||||
int? index;
|
int? index;
|
||||||
String? intro;
|
String? intro;
|
||||||
@ -45,12 +48,13 @@ class MediaVideoItemModel {
|
|||||||
int? likeState;
|
int? likeState;
|
||||||
int? favState;
|
int? favState;
|
||||||
int? page;
|
int? page;
|
||||||
|
int? cid;
|
||||||
List<Page>? pages;
|
List<Page>? pages;
|
||||||
String? title;
|
String? title;
|
||||||
int? type;
|
int? type;
|
||||||
Upper? upper;
|
Upper? upper;
|
||||||
String? link;
|
String? link;
|
||||||
String? bvId;
|
String? bvid;
|
||||||
String? shortLink;
|
String? shortLink;
|
||||||
Rights? rights;
|
Rights? rights;
|
||||||
dynamic elecInfo;
|
dynamic elecInfo;
|
||||||
@ -64,6 +68,7 @@ class MediaVideoItemModel {
|
|||||||
factory MediaVideoItemModel.fromJson(Map<String, dynamic> json) =>
|
factory MediaVideoItemModel.fromJson(Map<String, dynamic> json) =>
|
||||||
MediaVideoItemModel(
|
MediaVideoItemModel(
|
||||||
id: json["id"],
|
id: json["id"],
|
||||||
|
aid: json["id"],
|
||||||
offset: json["offset"],
|
offset: json["offset"],
|
||||||
index: json["index"],
|
index: json["index"],
|
||||||
intro: json["intro"],
|
intro: json["intro"],
|
||||||
@ -77,6 +82,7 @@ class MediaVideoItemModel {
|
|||||||
likeState: json["like_state"],
|
likeState: json["like_state"],
|
||||||
favState: json["fav_state"],
|
favState: json["fav_state"],
|
||||||
page: json["page"],
|
page: json["page"],
|
||||||
|
cid: json["pages"] == null ? -1 : json["pages"].first['id'],
|
||||||
// json["pages"] 可能为null
|
// json["pages"] 可能为null
|
||||||
pages: json["pages"] == null
|
pages: json["pages"] == null
|
||||||
? []
|
? []
|
||||||
@ -85,7 +91,7 @@ class MediaVideoItemModel {
|
|||||||
type: json["type"],
|
type: json["type"],
|
||||||
upper: Upper.fromJson(json["upper"]),
|
upper: Upper.fromJson(json["upper"]),
|
||||||
link: json["link"],
|
link: json["link"],
|
||||||
bvId: json["bv_id"],
|
bvid: json["bv_id"],
|
||||||
shortLink: json["short_link"],
|
shortLink: json["short_link"],
|
||||||
rights: Rights.fromJson(json["rights"]),
|
rights: Rights.fromJson(json["rights"]),
|
||||||
elecInfo: json["elec_info"],
|
elecInfo: json["elec_info"],
|
||||||
|
|||||||
@ -189,8 +189,8 @@ class _BangumiInfoState extends State<BangumiInfo> {
|
|||||||
Stack(
|
Stack(
|
||||||
children: [
|
children: [
|
||||||
NetworkImgLayer(
|
NetworkImgLayer(
|
||||||
width: 105,
|
width: 115,
|
||||||
height: 160,
|
height: 115 / 0.75,
|
||||||
src: widget.bangumiDetail!.cover!,
|
src: widget.bangumiDetail!.cover!,
|
||||||
),
|
),
|
||||||
PBadge(
|
PBadge(
|
||||||
@ -208,7 +208,7 @@ class _BangumiInfoState extends State<BangumiInfo> {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => showIntroDetail(),
|
onTap: () => showIntroDetail(),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: 158,
|
height: 115 / 0.75,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
|||||||
@ -96,7 +96,8 @@ class _BangumiPageState extends State<BangumiPage>
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 268,
|
height: Get.size.width / 3 / 0.75 +
|
||||||
|
MediaQuery.textScalerOf(context).scale(50.0),
|
||||||
child: FutureBuilder(
|
child: FutureBuilder(
|
||||||
future: _futureBuilderFutureFollow,
|
future: _futureBuilderFutureFollow,
|
||||||
builder:
|
builder:
|
||||||
@ -117,7 +118,6 @@ class _BangumiPageState extends State<BangumiPage>
|
|||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
return Container(
|
return Container(
|
||||||
width: Get.size.width / 3,
|
width: Get.size.width / 3,
|
||||||
height: 254,
|
|
||||||
margin: EdgeInsets.only(
|
margin: EdgeInsets.only(
|
||||||
left: StyleString.safeSpace,
|
left: StyleString.safeSpace,
|
||||||
right: index ==
|
right: index ==
|
||||||
@ -208,8 +208,8 @@ class _BangumiPageState extends State<BangumiPage>
|
|||||||
crossAxisSpacing: StyleString.cardSpace,
|
crossAxisSpacing: StyleString.cardSpace,
|
||||||
// 列数
|
// 列数
|
||||||
crossAxisCount: 3,
|
crossAxisCount: 3,
|
||||||
mainAxisExtent: Get.size.width / 3 / 0.65 +
|
mainAxisExtent: Get.size.width / 3 / 0.75 +
|
||||||
MediaQuery.textScalerOf(context).scale(32.0),
|
MediaQuery.textScalerOf(context).scale(42.0),
|
||||||
),
|
),
|
||||||
delegate: SliverChildBuilderDelegate(
|
delegate: SliverChildBuilderDelegate(
|
||||||
(BuildContext context, int index) {
|
(BuildContext context, int index) {
|
||||||
|
|||||||
@ -86,9 +86,11 @@ class _BangumiPanelState extends State<BangumiPanel> {
|
|||||||
item.aid,
|
item.aid,
|
||||||
item.cover,
|
item.cover,
|
||||||
);
|
);
|
||||||
|
try {
|
||||||
if (_bottomSheetController != null) {
|
if (_bottomSheetController != null) {
|
||||||
_bottomSheetController?.close();
|
_bottomSheetController?.close();
|
||||||
}
|
}
|
||||||
|
} catch (_) {}
|
||||||
currentIndex.value = i;
|
currentIndex.value = i;
|
||||||
scrollToIndex();
|
scrollToIndex();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ class BangumiCardV extends StatelessWidget {
|
|||||||
StyleString.imgRadius,
|
StyleString.imgRadius,
|
||||||
),
|
),
|
||||||
child: AspectRatio(
|
child: AspectRatio(
|
||||||
aspectRatio: 0.65,
|
aspectRatio: 0.75,
|
||||||
child: LayoutBuilder(builder: (context, boxConstraints) {
|
child: LayoutBuilder(builder: (context, boxConstraints) {
|
||||||
final double maxWidth = boxConstraints.maxWidth;
|
final double maxWidth = boxConstraints.maxWidth;
|
||||||
final double maxHeight = boxConstraints.maxHeight;
|
final double maxHeight = boxConstraints.maxHeight;
|
||||||
|
|||||||
@ -157,7 +157,7 @@ class _OpusPageState extends State<OpusPage> {
|
|||||||
Container(
|
Container(
|
||||||
alignment: TextHelper.getAlignment(paragraph.align),
|
alignment: TextHelper.getAlignment(paragraph.align),
|
||||||
margin: const EdgeInsets.only(bottom: 10),
|
margin: const EdgeInsets.only(bottom: 10),
|
||||||
child: Text.rich(
|
child: SelectableText.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
children: paragraph.text?.nodes?.map((node) {
|
children: paragraph.text?.nodes?.map((node) {
|
||||||
return TextHelper.buildTextSpan(
|
return TextHelper.buildTextSpan(
|
||||||
|
|||||||
@ -20,7 +20,7 @@ class ReadPageController extends GetxController {
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
title.value = Get.parameters['title'] ?? '';
|
title.value = Get.parameters['title'] ?? '';
|
||||||
id = Get.parameters['id']!;
|
id = Get.parameters['id']!;
|
||||||
articleType = Get.parameters['articleType']!;
|
articleType = Get.parameters['articleType'] ?? 'read';
|
||||||
url = 'https://www.bilibili.com/read/cv$id';
|
url = 'https://www.bilibili.com/read/cv$id';
|
||||||
scrollController.addListener(_scrollListener);
|
scrollController.addListener(_scrollListener);
|
||||||
fetchViewInfo();
|
fetchViewInfo();
|
||||||
|
|||||||
@ -126,7 +126,6 @@ class _ReadPageState extends State<ReadPage> {
|
|||||||
Widget _buildContent(ReadDataModel cvData) {
|
Widget _buildContent(ReadDataModel cvData) {
|
||||||
final List<String> picList = _extractPicList(cvData);
|
final List<String> picList = _extractPicList(cvData);
|
||||||
final List<String> imgList = extractDataSrc(cvData.readInfo!.content!);
|
final List<String> imgList = extractDataSrc(cvData.readInfo!.content!);
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.fromLTRB(
|
padding: EdgeInsets.fromLTRB(
|
||||||
16, 0, 16, MediaQuery.of(context).padding.bottom + 40),
|
16, 0, 16, MediaQuery.of(context).padding.bottom + 40),
|
||||||
@ -163,10 +162,12 @@ class _ReadPageState extends State<ReadPage> {
|
|||||||
padding: const EdgeInsets.only(bottom: 20),
|
padding: const EdgeInsets.only(bottom: 20),
|
||||||
child: _buildAuthorWidget(cvData),
|
child: _buildAuthorWidget(cvData),
|
||||||
),
|
),
|
||||||
HtmlRender(
|
SelectionArea(
|
||||||
|
child: HtmlRender(
|
||||||
htmlContent: cvData.readInfo!.content!,
|
htmlContent: cvData.readInfo!.content!,
|
||||||
imgList: imgList,
|
imgList: imgList,
|
||||||
),
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -206,7 +207,7 @@ class _ReadPageState extends State<ReadPage> {
|
|||||||
return Container(
|
return Container(
|
||||||
alignment: TextHelper.getAlignment(paragraph.align),
|
alignment: TextHelper.getAlignment(paragraph.align),
|
||||||
margin: const EdgeInsets.only(bottom: 10),
|
margin: const EdgeInsets.only(bottom: 10),
|
||||||
child: Text.rich(
|
child: SelectableText.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
children: paragraph.text?.nodes?.map((node) {
|
children: paragraph.text?.nodes?.map((node) {
|
||||||
return TextHelper.buildTextSpan(node, paragraph.align, context);
|
return TextHelper.buildTextSpan(node, paragraph.align, context);
|
||||||
|
|||||||
@ -411,7 +411,12 @@ class VideoIntroController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 修改分P或番剧分集
|
// 修改分P或番剧分集
|
||||||
Future changeSeasonOrbangu(bvid, cid, aid, cover) async {
|
Future changeSeasonOrbangu(
|
||||||
|
String bvid,
|
||||||
|
int cid,
|
||||||
|
int? aid,
|
||||||
|
String? cover,
|
||||||
|
) async {
|
||||||
// 重新获取视频资源
|
// 重新获取视频资源
|
||||||
final VideoDetailController videoDetailCtr =
|
final VideoDetailController videoDetailCtr =
|
||||||
Get.find<VideoDetailController>(tag: heroTag);
|
Get.find<VideoDetailController>(tag: heroTag);
|
||||||
@ -422,13 +427,14 @@ class VideoIntroController extends GetxController {
|
|||||||
releatedCtr.queryRelatedVideo();
|
releatedCtr.queryRelatedVideo();
|
||||||
}
|
}
|
||||||
|
|
||||||
videoDetailCtr.bvid = bvid;
|
videoDetailCtr
|
||||||
videoDetailCtr.oid.value = aid ?? IdUtils.bv2av(bvid);
|
..bvid = bvid
|
||||||
videoDetailCtr.cid.value = cid;
|
..oid.value = aid ?? IdUtils.bv2av(bvid)
|
||||||
videoDetailCtr.danmakuCid.value = cid;
|
..cid.value = cid
|
||||||
videoDetailCtr.cover.value = cover;
|
..danmakuCid.value = cid
|
||||||
videoDetailCtr.queryVideoUrl();
|
..cover.value = cover ?? ''
|
||||||
videoDetailCtr.clearSubtitleContent();
|
..queryVideoUrl()
|
||||||
|
..clearSubtitleContent();
|
||||||
await videoDetailCtr.getSubtitle();
|
await videoDetailCtr.getSubtitle();
|
||||||
videoDetailCtr.setSubtitleContent();
|
videoDetailCtr.setSubtitleContent();
|
||||||
// 重新请求评论
|
// 重新请求评论
|
||||||
@ -478,7 +484,13 @@ class VideoIntroController extends GetxController {
|
|||||||
final List episodes = [];
|
final List episodes = [];
|
||||||
bool isPages = false;
|
bool isPages = false;
|
||||||
late String cover;
|
late String cover;
|
||||||
if (videoDetail.value.ugcSeason != null) {
|
final VideoDetailController videoDetailCtr =
|
||||||
|
Get.find<VideoDetailController>(tag: heroTag);
|
||||||
|
|
||||||
|
/// 优先稍后再看、收藏夹
|
||||||
|
if (videoDetailCtr.isWatchLaterVisible.value) {
|
||||||
|
episodes.addAll(videoDetailCtr.mediaList);
|
||||||
|
} else if (videoDetail.value.ugcSeason != null) {
|
||||||
final UgcSeason ugcSeason = videoDetail.value.ugcSeason!;
|
final UgcSeason ugcSeason = videoDetail.value.ugcSeason!;
|
||||||
final List<SectionItem> sections = ugcSeason.sections!;
|
final List<SectionItem> sections = ugcSeason.sections!;
|
||||||
for (int i = 0; i < sections.length; i++) {
|
for (int i = 0; i < sections.length; i++) {
|
||||||
@ -495,10 +507,15 @@ class VideoIntroController extends GetxController {
|
|||||||
episodes.indexWhere((e) => e.cid == lastPlayCid.value);
|
episodes.indexWhere((e) => e.cid == lastPlayCid.value);
|
||||||
int nextIndex = currentIndex + 1;
|
int nextIndex = currentIndex + 1;
|
||||||
cover = episodes[nextIndex].cover;
|
cover = episodes[nextIndex].cover;
|
||||||
final VideoDetailController videoDetailCtr =
|
|
||||||
Get.find<VideoDetailController>(tag: heroTag);
|
|
||||||
final PlayRepeat platRepeat = videoDetailCtr.plPlayerController.playRepeat;
|
final PlayRepeat platRepeat = videoDetailCtr.plPlayerController.playRepeat;
|
||||||
|
|
||||||
|
int cid = episodes[nextIndex].cid!;
|
||||||
|
while (cid == -1) {
|
||||||
|
nextIndex += 1;
|
||||||
|
SmartDialog.showToast('当前视频暂不支持播放,自动跳过');
|
||||||
|
cid = episodes[nextIndex].cid!;
|
||||||
|
}
|
||||||
|
|
||||||
// 列表循环
|
// 列表循环
|
||||||
if (nextIndex >= episodes.length) {
|
if (nextIndex >= episodes.length) {
|
||||||
if (platRepeat == PlayRepeat.listCycle) {
|
if (platRepeat == PlayRepeat.listCycle) {
|
||||||
@ -508,7 +525,6 @@ class VideoIntroController extends GetxController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final int cid = episodes[nextIndex].cid!;
|
|
||||||
final String rBvid = isPages ? bvid : episodes[nextIndex].bvid;
|
final String rBvid = isPages ? bvid : episodes[nextIndex].bvid;
|
||||||
final int rAid = isPages ? IdUtils.bv2av(bvid) : episodes[nextIndex].aid!;
|
final int rAid = isPages ? IdUtils.bv2av(bvid) : episodes[nextIndex].aid!;
|
||||||
changeSeasonOrbangu(rBvid, cid, rAid, cover);
|
changeSeasonOrbangu(rBvid, cid, rAid, cover);
|
||||||
|
|||||||
@ -153,7 +153,17 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
|
|||||||
child: Container(
|
child: Container(
|
||||||
height: 40,
|
height: 40,
|
||||||
padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),
|
padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).colorScheme.surface,
|
color: Theme.of(context).colorScheme.surface,
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Theme.of(context).colorScheme.surface,
|
||||||
|
blurRadius: 0.0,
|
||||||
|
spreadRadius: 0.0,
|
||||||
|
offset: const Offset(2, 0),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@ -200,10 +200,11 @@ class ReplyItem extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Row(
|
RichText(
|
||||||
children: <Widget>[
|
text: TextSpan(
|
||||||
Text(
|
children: [
|
||||||
Utils.dateFormat(replyItem!.ctime),
|
TextSpan(
|
||||||
|
text: Utils.dateFormat(replyItem!.ctime),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: textTheme.labelSmall!.fontSize,
|
fontSize: textTheme.labelSmall!.fontSize,
|
||||||
color: colorScheme.outline,
|
color: colorScheme.outline,
|
||||||
@ -211,14 +212,24 @@ class ReplyItem extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
if (replyItem!.replyControl != null &&
|
if (replyItem!.replyControl != null &&
|
||||||
replyItem!.replyControl!.location != '')
|
replyItem!.replyControl!.location != '')
|
||||||
Text(
|
TextSpan(
|
||||||
' • ${replyItem!.replyControl!.location!}',
|
text: ' • ${replyItem!.replyControl!.location!}',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: textTheme.labelSmall!.fontSize,
|
fontSize: textTheme.labelSmall!.fontSize,
|
||||||
color: colorScheme.outline),
|
color: colorScheme.outline,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (replyItem!.invisible!)
|
||||||
|
TextSpan(
|
||||||
|
text: ' • 隐藏的评论',
|
||||||
|
style: TextStyle(
|
||||||
|
color: colorScheme.outline,
|
||||||
|
fontSize: textTheme.labelSmall!.fontSize,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -703,14 +714,11 @@ InlineSpan buildContent(
|
|||||||
'',
|
'',
|
||||||
);
|
);
|
||||||
} else if (RegExp(r'^cv\d+$').hasMatch(matchStr)) {
|
} else if (RegExp(r'^cv\d+$').hasMatch(matchStr)) {
|
||||||
Get.toNamed(
|
Get.toNamed('/read', parameters: {
|
||||||
'/webview',
|
'title': title,
|
||||||
parameters: {
|
'id': Utils.matchNum(matchStr).first.toString(),
|
||||||
'url': 'https://www.bilibili.com/read/$matchStr',
|
'articleType': 'read',
|
||||||
'type': 'url',
|
});
|
||||||
'pageTitle': title
|
|
||||||
},
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
Uri uri = Uri.parse(matchStr.replaceAll('/?', '?'));
|
Uri uri = Uri.parse(matchStr.replaceAll('/?', '?'));
|
||||||
SchemeEntity scheme = SchemeEntity(
|
SchemeEntity scheme = SchemeEntity(
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
||||||
import 'package:floating/floating.dart';
|
import 'package:floating/floating.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
@ -81,6 +82,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
|||||||
videoIntroController.videoDetail.listen((value) {
|
videoIntroController.videoDetail.listen((value) {
|
||||||
videoPlayerServiceHandler.onVideoDetailChange(value, vdCtr.cid.value);
|
videoPlayerServiceHandler.onVideoDetailChange(value, vdCtr.cid.value);
|
||||||
});
|
});
|
||||||
|
if (vdCtr.videoType == SearchType.media_bangumi) {
|
||||||
bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag);
|
bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag);
|
||||||
bangumiIntroController.bangumiDetail.listen((value) {
|
bangumiIntroController.bangumiDetail.listen((value) {
|
||||||
videoPlayerServiceHandler.onVideoDetailChange(value, vdCtr.cid.value);
|
videoPlayerServiceHandler.onVideoDetailChange(value, vdCtr.cid.value);
|
||||||
@ -89,6 +91,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
|||||||
videoPlayerServiceHandler.onVideoDetailChange(
|
videoPlayerServiceHandler.onVideoDetailChange(
|
||||||
bangumiIntroController.bangumiDetail.value, p0);
|
bangumiIntroController.bangumiDetail.value, p0);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
statusBarHeight = localCache.get('statusBarHeight');
|
statusBarHeight = localCache.get('statusBarHeight');
|
||||||
autoExitFullcreen =
|
autoExitFullcreen =
|
||||||
setting.get(SettingBoxKey.enableAutoExit, defaultValue: false);
|
setting.get(SettingBoxKey.enableAutoExit, defaultValue: false);
|
||||||
@ -594,10 +597,21 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
|||||||
key: vdCtr.scaffoldKey,
|
key: vdCtr.scaffoldKey,
|
||||||
appBar: PreferredSize(
|
appBar: PreferredSize(
|
||||||
preferredSize: const Size.fromHeight(0),
|
preferredSize: const Size.fromHeight(0),
|
||||||
child: AppBar(
|
child: StreamBuilder(
|
||||||
|
stream: appbarStream.stream.distinct(),
|
||||||
|
initialData: 0,
|
||||||
|
builder: ((context, snapshot) {
|
||||||
|
return AppBar(
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
scrolledUnderElevation: 0,
|
scrolledUnderElevation: 0,
|
||||||
|
systemOverlayStyle: Get.isDarkMode
|
||||||
|
? SystemUiOverlayStyle.light
|
||||||
|
: snapshot.data!.toDouble() > kToolbarHeight
|
||||||
|
? SystemUiOverlayStyle.dark
|
||||||
|
: SystemUiOverlayStyle.light,
|
||||||
|
);
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: ExtendedNestedScrollView(
|
body: ExtendedNestedScrollView(
|
||||||
|
|||||||
@ -109,7 +109,7 @@ class _MediaListPanelState extends State<MediaListPanel> {
|
|||||||
var item = mediaList[index];
|
var item = mediaList[index];
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
String bvid = item.bvId!;
|
String bvid = item.bvid!;
|
||||||
int? aid = item.id;
|
int? aid = item.id;
|
||||||
String cover = item.cover ?? '';
|
String cover = item.cover ?? '';
|
||||||
final int cid =
|
final int cid =
|
||||||
@ -173,7 +173,7 @@ class _MediaListPanelState extends State<MediaListPanel> {
|
|||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
color: item.bvId == widget.bvid
|
color: item.bvid == widget.bvid
|
||||||
? Theme.of(context)
|
? Theme.of(context)
|
||||||
.colorScheme
|
.colorScheme
|
||||||
.primary
|
.primary
|
||||||
|
|||||||
@ -175,6 +175,11 @@ class PiliSchame {
|
|||||||
if (lastPathSegment.contains('ep')) {
|
if (lastPathSegment.contains('ep')) {
|
||||||
RoutePush.bangumiPush(null, Utils.matchNum(lastPathSegment).first);
|
RoutePush.bangumiPush(null, Utils.matchNum(lastPathSegment).first);
|
||||||
}
|
}
|
||||||
|
} else if (path.startsWith('/BV')) {
|
||||||
|
final String bvid = path.split('?').first.split('/').last;
|
||||||
|
_videoPush(null, bvid);
|
||||||
|
} else if (path.startsWith('/av')) {
|
||||||
|
_videoPush(Utils.matchNum(path.split('?').first).first, null);
|
||||||
}
|
}
|
||||||
} else if (host.contains('live')) {
|
} else if (host.contains('live')) {
|
||||||
int roomId = int.parse(path!.split('/').last);
|
int roomId = int.parse(path!.split('/').last);
|
||||||
|
|||||||
@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.0.24+1024
|
version: 1.0.25+1025
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.0.0 <4.0.0"
|
sdk: ">=3.0.0 <4.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user