From 59c80423fcef0e15d769315f40ccc6104442e455 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Thu, 13 Nov 2025 01:51:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(message):=20=E6=B7=BB=E5=8A=A0=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E6=B6=88=E6=81=AF=E5=B1=95=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 VoiceItem 组件用于展示语音消息 - 在 MessageItem 中增加对 VOICE 类型消息的处理逻辑 - 根据消息类型动态渲染语音消息组件 - 优化时间标签构建逻辑,提升代码可读性- 移除冗余的空行和不必要的间距设置- 保持非文本消息的占位符显示方式不变 --- lib/widget/message/message_item.dart | 41 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/widget/message/message_item.dart b/lib/widget/message/message_item.dart index a879f2d..95d3196 100644 --- a/lib/widget/message/message_item.dart +++ b/lib/widget/message/message_item.dart @@ -4,6 +4,7 @@ import 'package:im_flutter_sdk/im_flutter_sdk.dart'; import 'text_item.dart'; import 'image_item.dart'; +import 'voice_item.dart'; class MessageItem extends StatelessWidget { final EMMessage message; @@ -39,16 +40,23 @@ class MessageItem extends StatelessWidget { formattedTime: formatMessageTime(message.serverTime), ); } - + // 处理语音消息 + else if (message.body.type == MessageType.VOICE) { + final voiceBody = message.body as EMVoiceMessageBody; + return VoiceItem( + voiceBody: voiceBody, + isSentByMe: isSentByMe, + showTime: shouldShowTime(), + formattedTime: formatMessageTime(message.serverTime), + ); + } + // 非文本消息显示占位符 return Column( children: [ if (shouldShowTime()) _buildTimeLabel(), Container( - padding: EdgeInsets.symmetric( - horizontal: 16.w, - vertical: 8.h, - ), + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h), child: Text('不支持的消息类型'), ), ], @@ -60,7 +68,7 @@ class MessageItem extends StatelessWidget { if (previousMessage == null) { return true; // 第一条消息显示时间 } - + // 判断距离上一条消息是否超过20分钟(1200000毫秒) return (message.serverTime - previousMessage!.serverTime) > 1200000; } @@ -68,22 +76,15 @@ class MessageItem extends StatelessWidget { // 构建时间标签 Widget _buildTimeLabel() { final formattedTime = formatMessageTime(message.serverTime); - + return Container( alignment: Alignment.center, - padding: EdgeInsets.symmetric( - horizontal: 16.w, - ), + padding: EdgeInsets.symmetric(horizontal: 16.w), child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, - ), + padding: EdgeInsets.symmetric(horizontal: 12.w), child: Text( formattedTime, - style: TextStyle( - fontSize: 12.sp, - color: Colors.grey, - ), + style: TextStyle(fontSize: 12.sp, color: Colors.grey), ), ), ); @@ -96,7 +97,7 @@ class MessageItem extends StatelessWidget { final today = DateTime(now.year, now.month, now.day); final yesterday = DateTime(now.year, now.month, now.day - 1); final messageDate = DateTime(date.year, date.month, date.day); - + if (messageDate.isAtSameMomentAs(today)) { // 今天的消息显示时间 return '今天 ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}'; @@ -108,6 +109,4 @@ class MessageItem extends StatelessWidget { return '${date.month}月${date.day}日 ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}'; } } - - -} \ No newline at end of file +}