From 5dd3ff32b643f79f273d5a4134bf42969d32afb5 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 16 Feb 2025 22:00:55 +0800 Subject: [PATCH] fix: view forwarded dyn Signed-off-by: bggRGjQaUbCoE --- lib/models/dynamics/result.dart | 34 ++-------- lib/pages/dynamics/detail/controller.dart | 3 +- lib/pages/dynamics/detail/view.dart | 54 +++++++++++----- lib/pages/dynamics/widgets/author_panel.dart | 3 +- lib/pages/dynamics/widgets/forward_panel.dart | 63 ++++++++++--------- lib/pages/dynamics/widgets/video_panel.dart | 3 +- lib/utils/utils.dart | 4 +- 7 files changed, 81 insertions(+), 83 deletions(-) diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 309c179c2..2c2d0ec83 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -35,47 +35,23 @@ class DynamicItemModel { Map? basic; dynamic idStr; ItemModulesModel? modules; - ItemOrigModel? orig; + DynamicItemModel? orig; String? type; bool? visible; + bool? isForwarded; DynamicItemModel.fromJson(Map json) { basic = json['basic']; idStr = json['id_str']; modules = ItemModulesModel.fromJson(json['modules']); - orig = json['orig'] != null ? ItemOrigModel.fromJson(json['orig']) : null; + orig = + json['orig'] != null ? DynamicItemModel.fromJson(json['orig']) : null; + orig?.isForwarded = true; type = json['type']; visible = json['visible']; } } -class ItemOrigModel { - ItemOrigModel({ - this.basic, - this.isStr, - this.modules, - this.type, - this.visible, - this.idStr, - }); - - Map? basic; - String? isStr; - ItemModulesModel? modules; - String? type; - bool? visible; - dynamic idStr; - - ItemOrigModel.fromJson(Map json) { - basic = json['basic']; - isStr = json['is_str']; - modules = ItemModulesModel.fromJson(json['modules']); - type = json['type']; - visible = json['visible']; - idStr = json['id_str']; - } -} - // 单个动态详情 class ItemModulesModel { ItemModulesModel({ diff --git a/lib/pages/dynamics/detail/controller.dart b/lib/pages/dynamics/detail/controller.dart index 87a67ad52..bbbb5c563 100644 --- a/lib/pages/dynamics/detail/controller.dart +++ b/lib/pages/dynamics/detail/controller.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/grpc/app/main/community/reply/v1/reply.pb.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/common/reply_controller.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/storage.dart'; @@ -12,7 +13,7 @@ class DynamicDetailController extends ReplyController { DynamicDetailController(this.oid, this.type); int? oid; int? type; - dynamic item; + late DynamicItemModel item; int? floor; late final horizontalPreview = GStorage.horizontalPreview; diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index cc55161e7..0ca3e98cf 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -474,15 +474,19 @@ class _DynamicDetailPageState extends State _dynamicDetailController .item .modules - .moduleStat - .forward + ?.moduleStat + ?.forward ?.count ?? '0') ?? 0; + _dynamicDetailController.item.modules + ?.moduleStat ??= ModuleStatModel(); + _dynamicDetailController.item.modules! + .moduleStat?.forward ??= ForWard(); _dynamicDetailController .item - .modules - .moduleStat + .modules! + .moduleStat! .forward! .count = (count + 1).toString(); if (btnContext.mounted) { @@ -507,12 +511,12 @@ class _DynamicDetailPageState extends State ), label: Text( _dynamicDetailController.item.modules - .moduleStat.forward!.count != + ?.moduleStat?.forward?.count != null ? Utils.numFormat(_dynamicDetailController .item - .modules - .moduleStat + .modules! + .moduleStat! .forward! .count) : '转发', @@ -553,17 +557,24 @@ class _DynamicDetailPageState extends State }, ), icon: Icon( - _dynamicDetailController - .item.modules.moduleStat.like!.status! + _dynamicDetailController.item.modules + ?.moduleStat?.like?.status == + true ? FontAwesomeIcons.solidThumbsUp : FontAwesomeIcons.thumbsUp, size: 16, - color: _dynamicDetailController - .item.modules.moduleStat.like!.status! + color: _dynamicDetailController.item.modules + ?.moduleStat?.like?.status == + true ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.outline, semanticLabel: _dynamicDetailController - .item.modules.moduleStat.like!.status! + .item + .modules + ?.moduleStat + ?.like + ?.status == + true ? "已赞" : "点赞", ), @@ -582,15 +593,24 @@ class _DynamicDetailPageState extends State }, child: Text( _dynamicDetailController.item.modules - .moduleStat.like!.count != + ?.moduleStat?.like?.count != null ? Utils.numFormat( - _dynamicDetailController.item - .modules.moduleStat.like!.count) + _dynamicDetailController + .item + .modules! + .moduleStat! + .like! + .count) : '点赞', style: TextStyle( - color: _dynamicDetailController.item - .modules.moduleStat.like!.status! + color: _dynamicDetailController + .item + .modules + ?.moduleStat + ?.like + ?.status == + true ? Theme.of(context) .colorScheme .primary diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 8cf362b52..5989b50dc 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -1,6 +1,5 @@ import 'package:PiliPlus/common/widgets/radio_widget.dart'; import 'package:PiliPlus/http/index.dart'; -import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:cached_network_image/cached_network_image.dart'; @@ -98,7 +97,7 @@ class AuthorPanel extends StatelessWidget { ), child: Row( children: [ - Text(item is ItemOrigModel + Text(item.isForwarded == true ? Utils.dateFormat(item.modules.moduleAuthor.pubTs) : item.modules.moduleAuthor.pubTime), if (item.modules.moduleAuthor.pubTime != '' && diff --git a/lib/pages/dynamics/widgets/forward_panel.dart b/lib/pages/dynamics/widgets/forward_panel.dart index 1515f4a3d..69a37dc69 100644 --- a/lib/pages/dynamics/widgets/forward_panel.dart +++ b/lib/pages/dynamics/widgets/forward_panel.dart @@ -162,37 +162,38 @@ Widget forWard(item, context, source, callback, {floor = 1}) { // 文章 case 'DYNAMIC_TYPE_ARTICLE': return switch (item) { - ItemOrigModel() => articlePanel(item, context, callback, floor: floor), - DynamicItemModel() => item.modules?.moduleDynamic?.major?.blocked != - null - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (item.modules?.moduleDynamic?.major?.blocked?['title'] != - null) - Text( - '${item.modules?.moduleDynamic?.major?.blocked!['title']}', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - ), - ), - if (item.modules?.moduleDynamic?.major - ?.blocked?['hint_message'] != - null) - Text( - '${item.modules?.moduleDynamic?.major?.blocked!['hint_message']}', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.outline, - ), - ) - ], - ), - ) - : const SizedBox.shrink(), + DynamicItemModel() => item.isForwarded == true + ? articlePanel(item, context, callback, floor: floor) + : item.modules?.moduleDynamic?.major?.blocked != null + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (item.modules?.moduleDynamic?.major + ?.blocked?['title'] != + null) + Text( + '${item.modules?.moduleDynamic?.major?.blocked!['title']}', + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + ), + ), + if (item.modules?.moduleDynamic?.major + ?.blocked?['hint_message'] != + null) + Text( + '${item.modules?.moduleDynamic?.major?.blocked!['hint_message']}', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.outline, + ), + ) + ], + ), + ) + : const SizedBox.shrink(), _ => const SizedBox.shrink(), }; // return Container( diff --git a/lib/pages/dynamics/widgets/video_panel.dart b/lib/pages/dynamics/widgets/video_panel.dart index 124f9b590..e40ab9a44 100644 --- a/lib/pages/dynamics/widgets/video_panel.dart +++ b/lib/pages/dynamics/widgets/video_panel.dart @@ -1,5 +1,4 @@ // 视频or合集 -import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/common/constants.dart'; @@ -159,7 +158,7 @@ Widget videoSeasonWidget(item, context, type, {floor = 1}) { if (richNodes != null) Text.rich(richNodes), const SizedBox(height: 6), ], - if (item is ItemOrigModel) + if (item.isForwarded == true) buildCover() else Padding( diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index b03182da2..2fc10b54a 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -51,9 +51,11 @@ class Utils { feedBack(); String dynamicId = item.idStr!; // 1 已点赞 2 不喜欢 0 未操作 + item.modules?.moduleStat ??= ModuleStatModel(); + item.modules?.moduleStat.like ??= Like(); Like like = item.modules.moduleStat.like; int count = like.count == '点赞' ? 0 : int.parse(like.count ?? '0'); - bool status = like.status!; + bool status = like.status ?? false; int up = status ? 2 : 1; var res = await DynamicsHttp.likeDynamic(dynamicId: dynamicId, up: up); if (res['status']) {