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.
160 lines
3.8 KiB
160 lines
3.8 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<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);
|
|
}
|
|
}
|
|
}
|