会话页面
This commit is contained in:
274
lib/views/conversation/widgets/message_widget.dart
Normal file
274
lib/views/conversation/widgets/message_widget.dart
Normal file
@@ -0,0 +1,274 @@
|
||||
import 'package:chat/configs/app_colors.dart';
|
||||
import 'package:chat/routes/contact_routes.dart';
|
||||
import 'package:chat/routes/user_routes.dart';
|
||||
import 'package:chat/services/auth_service.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_custom_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_face_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_file_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_image_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_location_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_merger_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_sound_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_text_message.dart';
|
||||
import 'package:chat/views/conversation/widgets/show_video_message.dart';
|
||||
import 'package:chat/widgets/custom_avatar.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tencent_im_sdk_plugin/enum/group_change_info_type.dart';
|
||||
import 'package:tencent_im_sdk_plugin/enum/group_tips_elem_type.dart';
|
||||
import 'package:tencent_im_sdk_plugin/enum/message_elem_type.dart';
|
||||
import 'package:tencent_im_sdk_plugin/models/v2_tim_message.dart';
|
||||
|
||||
class MessageWidget extends StatelessWidget {
|
||||
final V2TimMessage message;
|
||||
|
||||
const MessageWidget(this.message, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
switch (message.elemType) {
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_TEXT:
|
||||
return _buildMessage(ShowTextMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_IMAGE:
|
||||
return _buildMessage(ShowImageMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_SOUND:
|
||||
return _buildMessage(ShowSoundMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_VIDEO:
|
||||
return _buildMessage(ShowVideoMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_FILE:
|
||||
return _buildMessage(ShowFileMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_LOCATION:
|
||||
return _buildMessage(ShowLocationMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_FACE:
|
||||
return _buildMessage(ShowFaceMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_MERGER:
|
||||
return _buildMessage(ShowMergerMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_CUSTOM:
|
||||
return _buildMessage(ShowCustomMessage(message));
|
||||
case MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS:
|
||||
return _buildGroupTipMessage();
|
||||
default:
|
||||
return Text('未识别的消息类型 ${message.elemType}');
|
||||
}
|
||||
}
|
||||
|
||||
/// 构造群提示消息
|
||||
Widget _buildGroupTipMessage() {
|
||||
switch (message.groupTipsElem!.type) {
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_GROUP_INFO_CHANGE:
|
||||
return _buildGroupInfoChangeMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_JOIN:
|
||||
return _buildGroupTypeJoinMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_INVITE:
|
||||
return _buildGroupTypeInviteMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_QUIT:
|
||||
return _buildGroupTypeQuitMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_KICKED:
|
||||
return _buildGroupTypeKickedMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_SET_ADMIN:
|
||||
return _buildGroupTypeSetAdminMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_CANCEL_ADMIN:
|
||||
return _buildGroupTypeCancelAdminMessage();
|
||||
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE:
|
||||
return _buildGroupTypeMemberInfoChangeMessage();
|
||||
default:
|
||||
return Text(message.groupTipsElem!.type.toString());
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildGroupTypeMemberInfoChangeMessage() {
|
||||
return Center(
|
||||
child: Text(
|
||||
'${message.groupTipsElem!.opMember.nickName}修改了群成员资料',
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGroupTypeCancelAdminMessage() {
|
||||
String op = message.groupTipsElem!.opMember.nickName ?? '';
|
||||
String text = '';
|
||||
for (var e in message.groupTipsElem!.memberList!) {
|
||||
text += e?.nickName ?? '\t';
|
||||
}
|
||||
text = '$op取消了$text的管理员身份';
|
||||
return Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGroupTypeSetAdminMessage() {
|
||||
String op = message.groupTipsElem!.opMember.nickName ?? '';
|
||||
String text = '';
|
||||
for (var e in message.groupTipsElem!.memberList!) {
|
||||
text += e?.nickName ?? '\t';
|
||||
}
|
||||
text = '$op将$text设置为管理员';
|
||||
return Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGroupTypeKickedMessage() {
|
||||
String op = message.groupTipsElem!.opMember.nickName ?? '';
|
||||
String text = '';
|
||||
for (var e in message.groupTipsElem!.memberList!) {
|
||||
text += e?.nickName ?? '\t';
|
||||
}
|
||||
text = '$op将$text踢出群组';
|
||||
return Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 退出群组的消息解析
|
||||
Widget _buildGroupTypeQuitMessage() {
|
||||
if (message.groupTipsElem!.memberList!.isEmpty) {
|
||||
return Container();
|
||||
}
|
||||
return Center(
|
||||
child: Text(
|
||||
'${message.groupTipsElem!.memberList!.first?.nickName}退出了群组',
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGroupTypeInviteMessage() {
|
||||
String op = message.groupTipsElem!.opMember.nickName ?? '';
|
||||
String text = '';
|
||||
for (var e in message.groupTipsElem!.memberList!) {
|
||||
text += e?.nickName ?? '\t';
|
||||
}
|
||||
text = '$op邀请$text加入群组';
|
||||
return Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGroupTypeJoinMessage() {
|
||||
String text = '';
|
||||
for (var e in message.groupTipsElem!.memberList!) {
|
||||
text += e?.nickName ?? '\t';
|
||||
}
|
||||
text = '$text加入群组';
|
||||
return Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 解析群资料修改的内容
|
||||
Widget _buildGroupInfoChangeMessage() {
|
||||
String text = '';
|
||||
switch (message.groupTipsElem!.groupChangeInfoList!.first!.type) {
|
||||
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_NAME:
|
||||
text =
|
||||
'${message.groupTipsElem!.opMember.nickName} 修改群名称 ${message.groupTipsElem!.groupChangeInfoList!.first!.value}';
|
||||
break;
|
||||
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_INTRODUCTION:
|
||||
text = '群简介修改';
|
||||
break;
|
||||
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_NOTIFICATION:
|
||||
text = '${message.groupTipsElem!.opMember.nickName} 更新了群公告';
|
||||
break;
|
||||
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_FACE_URL:
|
||||
text = '群头像修改';
|
||||
break;
|
||||
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER:
|
||||
text = '${message.groupTipsElem!.memberList!.first!.nickName} 成为新群主';
|
||||
break;
|
||||
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_CUSTOM:
|
||||
text = '群自定义字段变更';
|
||||
break;
|
||||
default:
|
||||
text = message.groupTipsElem!.groupChangeInfoList![0]!.type.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
return Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
color: AppColors.unactive,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 构造普通内容的消息
|
||||
Widget _buildMessage(Widget child) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
textDirection: message.isSelf! ? TextDirection.rtl : TextDirection.ltr,
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () {
|
||||
if (message.isSelf!) {
|
||||
Get.toNamed(UserRoutes.info);
|
||||
} else {
|
||||
Get.toNamed(
|
||||
ContactRoutes.friendProfile,
|
||||
);
|
||||
}
|
||||
},
|
||||
child: message.isSelf!
|
||||
? GetX<AuthService>(builder: (_) {
|
||||
return CustomAvatar(
|
||||
_.userInfo.value.avatar ?? '',
|
||||
size: 43,
|
||||
radius: 4,
|
||||
);
|
||||
})
|
||||
: CustomAvatar(
|
||||
message.faceUrl,
|
||||
size: 43,
|
||||
radius: 4,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
GestureDetector(
|
||||
onLongPress: () {},
|
||||
child: child,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user