You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

191 lines
4.7 KiB

import 'package:get/get.dart';
import '../../im/im_manager.dart';
import 'package:im_flutter_sdk/im_flutter_sdk.dart';
class ChatController extends GetxController {
final String userId;
// 用户信息
final Rx<EMUserInfo?> userInfo = Rx<EMUserInfo?>(null);
// 消息列表
final RxList<EMMessage> messages = RxList<EMMessage>([]);
// 加载更多的游标
String? _cursor;
ChatController({required this.userId});
@override
void onInit() {
super.onInit();
// 初始化时获取用户信息和消息列表
fetchUserInfo();
fetchMessages();
}
/// 获取用户信息
Future<void> fetchUserInfo() async {
try {
final EMUserInfo? info = await IMManager.instance.getUserInfo(userId);
if (info != null) {
userInfo.value = info;
if (Get.isLogEnable) {
Get.log('获取用户信息成功: ${info.nickName}');
}
} else {
if (Get.isLogEnable) {
Get.log('未找到用户信息: $userId');
}
}
} catch (e) {
if (Get.isLogEnable) {
Get.log('获取用户信息失败: $e');
}
}
}
/// 发送消息
Future<bool> sendMessage(String content) async {
try {
final message = await IMManager.instance.sendTextMessage(content, userId);
if (message != null) {
// 发送成功后将消息添加到列表开头
messages.insert(0, message);
update();
return true;
}
return false;
} catch (e) {
if (Get.isLogEnable) {
Get.log('发送消息失败: $e');
}
return false;
}
}
/// 发送图片消息
Future<bool> sendImageMessage(String imagePath) async {
try {
final message = await IMManager.instance.sendImageMessage(
imagePath,
userId,
);
if (message != null) {
// 发送成功后将消息添加到列表开头
messages.insert(0, message);
update();
return true;
}
return false;
} catch (e) {
if (Get.isLogEnable) {
Get.log('发送图片消息失败: $e');
}
return false;
}
}
/// 发送语音消息
Future<bool> sendVoiceMessage(String filePath, int seconds) async {
try {
final message = await IMManager.instance.sendVoiceMessage(
filePath,
userId,
seconds,
);
if (message != null) {
// 发送成功后将消息添加到列表开头
messages.insert(0, message);
update();
return true;
}
return false;
} catch (e) {
if (Get.isLogEnable) {
Get.log('发送语音消息失败: $e');
}
return false;
}
}
/// 发送视频消息
Future<bool> sendVideoMessage(String filePath, int duration) async {
try {
print('🎬 [ChatController] 准备发送视频消息');
print('视频路径: $filePath');
print('视频时长: $duration');
final message = await IMManager.instance.sendVideoMessage(
filePath,
userId,
duration,
);
if (message != null) {
print('✅ [ChatController] 视频消息创建成功');
print('消息类型: ${message.body.type}');
// 发送成功后将消息添加到列表开头
messages.insert(0, message);
update();
return true;
}
print('❌ [ChatController] 视频消息创建失败');
return false;
} catch (e) {
print('❌ [ChatController] 发送视频消息异常: $e');
if (Get.isLogEnable) {
Get.log('发送视频消息失败: $e');
}
return false;
}
}
/// 获取消息列表
Future<void> fetchMessages({bool loadMore = false}) async {
try {
final List<EMMessage?> fetchedMessages = await IMManager.instance
.getMessages(
userId,
pageSize: 20,
startMsgId: loadMore ? _cursor : null,
);
// 过滤掉null消息
final List<EMMessage> validMessages = fetchedMessages
.whereType<EMMessage>()
.toList();
if (loadMore) {
// 加载更多时添加到列表末尾
messages.addAll(validMessages);
} else {
// 刷新时替换整个列表
messages.assignAll(validMessages);
}
// 通知UI更新
update();
// 更新游标
if (validMessages.isNotEmpty) {
_cursor = validMessages.last.msgId;
}
if (Get.isLogEnable) {
Get.log('获取消息成功,数量: ${validMessages.length}');
}
} catch (e) {
if (Get.isLogEnable) {
Get.log('获取消息失败: $e');
}
}
}
/// 加载更多消息
Future<void> loadMoreMessages() async {
if (_cursor != null) {
await fetchMessages(loadMore: true);
}
}
}