From 038285cbe6a39eccc0e7ed00d5c8e0fca1f5bfbe Mon Sep 17 00:00:00 2001 From: dom Date: Thu, 4 Jun 2026 19:35:09 +0800 Subject: [PATCH] fix parse opus Signed-off-by: dom --- .../dynamics/article_content_model.dart | 28 ++++++++++--------- lib/models/dynamics/vote_model.dart | 15 +++++----- lib/pages/article/widgets/opus_content.dart | 14 ++++++++-- lib/utils/color_utils.dart | 6 ++-- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/lib/models/dynamics/article_content_model.dart b/lib/models/dynamics/article_content_model.dart index 9911fe028..d328c0b47 100644 --- a/lib/models/dynamics/article_content_model.dart +++ b/lib/models/dynamics/article_content_model.dart @@ -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 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 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 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']; } } diff --git a/lib/models/dynamics/vote_model.dart b/lib/models/dynamics/vote_model.dart index 1c04bc8ec..5e647d3e7 100644 --- a/lib/models/dynamics/vote_model.dart +++ b/lib/models/dynamics/vote_model.dart @@ -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 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; } } diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 4239b4ca0..869882c8a 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -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, diff --git a/lib/utils/color_utils.dart b/lib/utils/color_utils.dart index e1faca74f..5e1ef2751 100644 --- a/lib/utils/color_utils.dart +++ b/lib/utils/color_utils.dart @@ -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);