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.
 
 
 
 
 

112 lines
2.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<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);
}
}
}