mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-09 04:24:53 +08:00
Compare commits
5 Commits
2.0.8
...
50070997de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50070997de | ||
|
|
88f0ab1dea | ||
|
|
038285cbe6 | ||
|
|
295a587df5 | ||
|
|
73d7d78080 |
@@ -57,7 +57,7 @@ abstract final class DynamicsHttp {
|
||||
tempBannedList: tempBannedList,
|
||||
);
|
||||
if (data.loadNext == true) {
|
||||
return followDynamic(
|
||||
return await followDynamic(
|
||||
type: type,
|
||||
offset: data.offset,
|
||||
mid: mid,
|
||||
|
||||
@@ -471,7 +471,7 @@ abstract final class MemberHttp {
|
||||
try {
|
||||
DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']);
|
||||
if (data.loadNext == true) {
|
||||
return memberDynamic(offset: data.offset, mid: mid);
|
||||
return await memberDynamic(offset: data.offset, mid: mid);
|
||||
}
|
||||
return Success(data);
|
||||
} catch (e, s) {
|
||||
|
||||
@@ -260,7 +260,7 @@ abstract final class VideoHttp {
|
||||
}
|
||||
return Success(data);
|
||||
} else if (epid != null && videoType == VideoType.ugc) {
|
||||
return videoUrl(
|
||||
return await videoUrl(
|
||||
avid: avid,
|
||||
bvid: bvid,
|
||||
cid: cid,
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:PiliPlus/common/style.dart' as common_style;
|
||||
import 'package:PiliPlus/models/dynamics/result.dart';
|
||||
import 'package:PiliPlus/models/dynamics/vote_model.dart';
|
||||
import 'package:PiliPlus/utils/color_utils.dart';
|
||||
import 'package:PiliPlus/utils/parse_int.dart';
|
||||
|
||||
class ArticleContentModel {
|
||||
int? align;
|
||||
@@ -124,14 +126,14 @@ class Word {
|
||||
|
||||
Word.fromJson(Map<String, dynamic> json) {
|
||||
words = json['words'];
|
||||
fontSize = (json['font_size'] as num?)?.toDouble();
|
||||
if (json['font_size'] case final num rawSize when rawSize != 0) {
|
||||
fontSize = rawSize.toDouble();
|
||||
}
|
||||
style = json['style'] == null ? null : Style.fromJson(json['style']);
|
||||
color = json['color'] == null
|
||||
? null
|
||||
: int.tryParse(
|
||||
'FF${(json['color'] as String).substring(1)}',
|
||||
radix: 16,
|
||||
);
|
||||
if (json['color'] case final String rawColor
|
||||
when rawColor.startsWith('#')) {
|
||||
color = ColourUtils.parse2Int(json['color']);
|
||||
}
|
||||
fontLevel = json['font_level'];
|
||||
}
|
||||
|
||||
@@ -275,7 +277,7 @@ class Music {
|
||||
|
||||
Music.fromJson(Map<String, dynamic> json) {
|
||||
cover = json['cover'];
|
||||
id = json['id'];
|
||||
id = safeToInt(json['id']);
|
||||
jumpUrl = json['jump_url'];
|
||||
label = json['label'];
|
||||
title = json['title'];
|
||||
@@ -291,12 +293,12 @@ class Opus {
|
||||
int? statView;
|
||||
|
||||
Opus.fromJson(Map<String, dynamic> json) {
|
||||
authorMid = json['author']?['mid'];
|
||||
authorMid = safeToInt(json['author']?['mid']);
|
||||
authorName = json['author']?['name'];
|
||||
cover = json['cover'];
|
||||
jumpUrl = json['jump_url'];
|
||||
title = json['title'];
|
||||
statView = json['stat']?['view'];
|
||||
statView = safeToInt(json['stat']?['view']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -317,9 +319,9 @@ class Live {
|
||||
descSecond = json['desc_second'];
|
||||
title = json['title'];
|
||||
jumpUrl = json['jump_url'];
|
||||
id = json['id'];
|
||||
liveState = json['live_state'];
|
||||
reserveType = json['reserve_type'];
|
||||
id = safeToInt(json['id']);
|
||||
liveState = safeToInt(json['live_state']);
|
||||
reserveType = safeToInt(json['reserve_type']);
|
||||
badgeText = json['badge']?['text'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
|
||||
import 'package:PiliPlus/utils/parse_int.dart';
|
||||
|
||||
class SimpleVoteInfo {
|
||||
int? choiceCnt;
|
||||
@@ -22,14 +23,14 @@ class SimpleVoteInfo {
|
||||
});
|
||||
|
||||
SimpleVoteInfo.fromJson(Map<String, dynamic> json) {
|
||||
choiceCnt = json['choice_cnt'];
|
||||
defaultShare = json['default_share'];
|
||||
choiceCnt = safeToInt(json['choice_cnt']);
|
||||
defaultShare = safeToInt(json['default_share']);
|
||||
desc = json['desc'];
|
||||
endTime = json['end_time'];
|
||||
status = json['status'];
|
||||
uid = json['uid'];
|
||||
voteId = json['vote_id'];
|
||||
joinNum = json['join_num'] ?? 0;
|
||||
endTime = safeToInt(json['end_time']);
|
||||
status = safeToInt(json['status']);
|
||||
uid = safeToInt(json['uid']);
|
||||
voteId = safeToInt(json['vote_id']);
|
||||
joinNum = safeToInt(json['join_num']) ?? 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -260,7 +260,7 @@ class OpusContent extends StatelessWidget {
|
||||
.toList(),
|
||||
);
|
||||
}
|
||||
case 3 when (element.line != null):
|
||||
case 3 when (element.line?.pic != null):
|
||||
final height = element.line!.pic!.height?.toDouble();
|
||||
return CachedNetworkImage(
|
||||
fit: .contain,
|
||||
@@ -336,6 +336,8 @@ class OpusContent extends StatelessWidget {
|
||||
Text(ugc.title!),
|
||||
Text(
|
||||
ugc.descSecond!,
|
||||
maxLines: 2,
|
||||
overflow: .ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
color: colorScheme.outline,
|
||||
@@ -378,6 +380,8 @@ class OpusContent extends StatelessWidget {
|
||||
if (common.desc2 != null)
|
||||
Text(
|
||||
common.desc2!,
|
||||
maxLines: 2,
|
||||
overflow: .ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
color: colorScheme.outline,
|
||||
@@ -415,6 +419,8 @@ class OpusContent extends StatelessWidget {
|
||||
if (live.descSecond != null)
|
||||
Text(
|
||||
live.descSecond!,
|
||||
maxLines: 2,
|
||||
overflow: .ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
color: colorScheme.outline,
|
||||
@@ -507,6 +513,8 @@ class OpusContent extends StatelessWidget {
|
||||
if (music.label != null)
|
||||
Text(
|
||||
music.label!,
|
||||
maxLines: 2,
|
||||
overflow: .ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
color: colorScheme.outline,
|
||||
@@ -693,9 +701,9 @@ class OpusContent extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
} catch (e, s) {
|
||||
return SelectableText(
|
||||
'错误的类型 $e',
|
||||
'错误的类型 $e${kDebugMode ? '\n$s' : ''}',
|
||||
style: const TextStyle(
|
||||
fontWeight: .bold,
|
||||
color: Colors.red,
|
||||
|
||||
@@ -387,8 +387,13 @@ class _PayCoinsPageState extends State<PayCoinsPage>
|
||||
],
|
||||
)
|
||||
else
|
||||
SizedBox(height: 100, child: _buildCoinWidget(0, 1)),
|
||||
SizedBox(height: isV ? 25 : 10),
|
||||
Center(
|
||||
child: SizedBox(height: 100, child: _buildCoinWidget(0, 1)),
|
||||
),
|
||||
if (isV)
|
||||
const SizedBox(height: 25)
|
||||
else
|
||||
const SizedBox(height: 10),
|
||||
if (_hasCopyright)
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
|
||||
@@ -200,44 +200,45 @@ class ChatItem extends StatelessWidget {
|
||||
|
||||
Widget msgTypeCommonShareCard_14(dynamic content, Color textColor) {
|
||||
if (content['source'] == '直播') {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
dynamic roomId = content['sourceID'];
|
||||
if (roomId is String) {
|
||||
roomId = int.parse(roomId);
|
||||
}
|
||||
PageUtils.toLiveRoom(roomId);
|
||||
},
|
||||
child: NetworkImgLayer(
|
||||
return GestureDetector(
|
||||
behavior: .opaque,
|
||||
onTap: () {
|
||||
dynamic roomId = content['sourceID'];
|
||||
if (roomId is String) {
|
||||
roomId = int.parse(roomId);
|
||||
}
|
||||
PageUtils.toLiveRoom(roomId);
|
||||
},
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
NetworkImgLayer(
|
||||
width: 220,
|
||||
height: 123.75,
|
||||
src: content['cover'],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Text(
|
||||
content['title'] ?? "",
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
const SizedBox(height: 6),
|
||||
Text(
|
||||
content['title'] ?? "",
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 1),
|
||||
Text(
|
||||
'${content['author']} · 直播',
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor.withValues(alpha: 0.6),
|
||||
fontSize: 12,
|
||||
const SizedBox(height: 1),
|
||||
Text(
|
||||
'${content['author']} · 直播',
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor.withValues(alpha: 0.6),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return def(textColor);
|
||||
@@ -246,6 +247,7 @@ class ChatItem extends StatelessWidget {
|
||||
|
||||
Widget msgTypeArticleCard_12(dynamic content, Color textColor) {
|
||||
return GestureDetector(
|
||||
behavior: .opaque,
|
||||
onTap: () => Get.toNamed(
|
||||
'/articlePage',
|
||||
parameters: {
|
||||
@@ -267,7 +269,7 @@ class ChatItem extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
SelectableText(
|
||||
Text(
|
||||
content['title'] ?? "",
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
@@ -278,8 +280,7 @@ class ChatItem extends StatelessWidget {
|
||||
),
|
||||
if (content['summary'] != null && content['summary'] != '') ...[
|
||||
const SizedBox(height: 1),
|
||||
SelectableText(
|
||||
scrollPhysics: const NeverScrollableScrollPhysics(),
|
||||
Text(
|
||||
content['summary'],
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
@@ -570,32 +571,20 @@ class ChatItem extends StatelessWidget {
|
||||
'unsupported source type: ${content['source']}',
|
||||
);
|
||||
}
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: onTap,
|
||||
child: NetworkImgLayer(
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
behavior: .opaque,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
NetworkImgLayer(
|
||||
width: 220,
|
||||
height: 123.75,
|
||||
src: content['thumb'],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Text(
|
||||
content['title'] ?? "",
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
if (content['source'] == 6 &&
|
||||
(content['headline'] as String?)?.isNotEmpty == true) ...[
|
||||
const SizedBox(height: 1),
|
||||
const SizedBox(height: 6),
|
||||
Text(
|
||||
content['headline'],
|
||||
content['title'] ?? "",
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
@@ -603,20 +592,33 @@ class ChatItem extends StatelessWidget {
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
],
|
||||
if (content['author'] != null) ...[
|
||||
const SizedBox(height: 1),
|
||||
Text(
|
||||
'${content['author']}${type != null ? ' · $type' : ''}',
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor.withValues(alpha: 0.6),
|
||||
fontSize: 12,
|
||||
if (content['source'] == 6 &&
|
||||
(content['headline'] as String?)?.isNotEmpty == true) ...[
|
||||
const SizedBox(height: 1),
|
||||
Text(
|
||||
content['headline'],
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
if (content['author'] != null) ...[
|
||||
const SizedBox(height: 1),
|
||||
Text(
|
||||
'${content['author']}${type != null ? ' · $type' : ''}',
|
||||
style: TextStyle(
|
||||
letterSpacing: 0.6,
|
||||
height: 1.5,
|
||||
color: textColor.withValues(alpha: 0.6),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -749,7 +751,7 @@ class ChatItem extends StatelessWidget {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
SelectableText(
|
||||
Text(
|
||||
content['title'],
|
||||
style: theme.textTheme.titleMedium!.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
|
||||
@@ -160,7 +160,7 @@ Future<ui.Image?> _getImg(String url) async {
|
||||
key: cacheKey,
|
||||
headers: Constants.baseHeaders,
|
||||
);
|
||||
return _loadImg(fileInfo.path);
|
||||
return await _loadImg(fileInfo.path);
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
|
||||
13
lib/scripts/navigation_drawer.patch
Normal file
13
lib/scripts/navigation_drawer.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
diff --git a/packages/flutter/lib/src/material/navigation_drawer.dart b/packages/flutter/lib/src/material/navigation_drawer.dart
|
||||
index 8a16764cb0c..6b8545c3781 100644
|
||||
--- a/packages/flutter/lib/src/material/navigation_drawer.dart
|
||||
+++ b/packages/flutter/lib/src/material/navigation_drawer.dart
|
||||
@@ -410,7 +410,7 @@ class _NavigationDestinationBuilder extends StatelessWidget {
|
||||
child: _NavigationDestinationSemantics(
|
||||
child: SizedBox(
|
||||
height: navigationDrawerTheme.tileHeight ?? defaults.tileHeight,
|
||||
- child: inkWell,
|
||||
+ child: Material(type: MaterialType.transparency, child: inkWell),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -26,6 +26,9 @@ $ImageAnimPatch = "lib/scripts/image_anim.patch"
|
||||
|
||||
$LayoutBuilderPatch = "lib/scripts/layout_builder.patch"
|
||||
|
||||
# https://github.com/bggRGjQaUbCoE/PiliPlus/issues/2308
|
||||
$NavigationDrawerPatch = "lib/scripts/navigation_drawer.patch"
|
||||
|
||||
# TODO: remove
|
||||
# https://github.com/flutter/flutter/issues/90223
|
||||
$ModalBarrierPatch = "lib/scripts/modal_barrier.patch"
|
||||
@@ -46,7 +49,7 @@ Set-Location $env:FLUTTER_ROOT
|
||||
$picks = @()
|
||||
$reverts = @()
|
||||
$patches = @($ModalBarrierPatch, $TextSelectionPatch, $MouseCursorPatch,
|
||||
$ImageAnimPatch, $LayoutBuilderPatch)
|
||||
$ImageAnimPatch, $LayoutBuilderPatch, $NavigationDrawerPatch)
|
||||
|
||||
switch ($platform.ToLower()) {
|
||||
"android" {
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import 'package:flutter/rendering.dart' show Color;
|
||||
|
||||
abstract final class ColourUtils {
|
||||
static Color parseColor(String color) =>
|
||||
Color(0xFF000000 | int.parse(color.substring(1), radix: 16));
|
||||
static int parse2Int(String color) =>
|
||||
0xFF000000 | int.parse(color.substring(1), radix: 16);
|
||||
|
||||
static Color parseColor(String color) => Color(parse2Int(color));
|
||||
|
||||
static Color parseMedalColor(String color) {
|
||||
final rgba = int.parse(color.substring(1), radix: 16);
|
||||
|
||||
Reference in New Issue
Block a user