From b2097cf04491de98d01ddce2ef817dbcb1e579c9 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 22 Aug 2025 19:00:06 +0800 Subject: [PATCH] :bug: Fix chat summary failed when lastMessage is null --- lib/models/chat.dart | 2 +- lib/models/chat.g.dart | 11 +++++--- lib/screens/chat/chat.dart | 55 +++++++++++++++++++++----------------- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/lib/models/chat.dart b/lib/models/chat.dart index 42f39685..9966e50a 100644 --- a/lib/models/chat.dart +++ b/lib/models/chat.dart @@ -104,7 +104,7 @@ sealed class SnChatMember with _$SnChatMember { sealed class SnChatSummary with _$SnChatSummary { const factory SnChatSummary({ required int unreadCount, - required SnChatMessage lastMessage, + required SnChatMessage? lastMessage, }) = _SnChatSummary; factory SnChatSummary.fromJson(Map json) => diff --git a/lib/models/chat.g.dart b/lib/models/chat.g.dart index e16bf6c7..f1dedb54 100644 --- a/lib/models/chat.g.dart +++ b/lib/models/chat.g.dart @@ -213,15 +213,18 @@ Map _$SnChatMemberToJson(_SnChatMember instance) => _SnChatSummary _$SnChatSummaryFromJson(Map json) => _SnChatSummary( unreadCount: (json['unread_count'] as num).toInt(), - lastMessage: SnChatMessage.fromJson( - json['last_message'] as Map, - ), + lastMessage: + json['last_message'] == null + ? null + : SnChatMessage.fromJson( + json['last_message'] as Map, + ), ); Map _$SnChatSummaryToJson(_SnChatSummary instance) => { 'unread_count': instance.unreadCount, - 'last_message': instance.lastMessage.toJson(), + 'last_message': instance.lastMessage?.toJson(), }; _MessageChange _$MessageChangeFromJson(Map json) => diff --git a/lib/screens/chat/chat.dart b/lib/screens/chat/chat.dart index 1273181b..6c08093e 100644 --- a/lib/screens/chat/chat.dart +++ b/lib/screens/chat/chat.dart @@ -79,33 +79,38 @@ class ChatRoomListTile extends HookConsumerWidget { color: Theme.of(context).colorScheme.primary, ), ), - Row( - spacing: 4, - children: [ - Badge( - label: Text(data.lastMessage.sender.account.nick), - textColor: Theme.of(context).colorScheme.onPrimary, - backgroundColor: Theme.of(context).colorScheme.primary, - ), - Expanded( - child: Text( - (data.lastMessage.content?.isNotEmpty ?? false) - ? data.lastMessage.content! - : 'messageNone'.tr(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.bodySmall, + if (data.lastMessage == null) + Text(room.description ?? 'descriptionNone'.tr(), maxLines: 1) + else + Row( + spacing: 4, + children: [ + Badge( + label: Text(data.lastMessage!.sender.account.nick), + textColor: Theme.of(context).colorScheme.onPrimary, + backgroundColor: Theme.of(context).colorScheme.primary, ), - ), - Align( - alignment: Alignment.centerRight, - child: Text( - RelativeTime(context).format(data.lastMessage.createdAt), - style: Theme.of(context).textTheme.bodySmall, + Expanded( + child: Text( + (data.lastMessage!.content?.isNotEmpty ?? false) + ? data.lastMessage!.content! + : 'messageNone'.tr(), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodySmall, + ), ), - ), - ], - ), + Align( + alignment: Alignment.centerRight, + child: Text( + RelativeTime( + context, + ).format(data.lastMessage!.createdAt), + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ], + ), ], ); },