sendMessage method
Future<V2TimValueCallback<V2TimMessage> >
sendMessage({
- String? id,
- V2TimMessage? message,
- void onSyncMsgID(
- String msgID
- required String? receiver,
- required String? groupID,
- int priority = 0,
- bool onlineUserOnly = false,
- OfflinePushInfo? offlinePushInfo,
- bool isExcludedFromUnreadCount = false,
- bool isExcludedFromLastMessage = false,
- bool? isSupportMessageExtension = false,
- bool? isExcludedFromContentModeration = false,
- bool needReadReceipt = false,
- String? cloudCustomData,
- String? localCustomData,
- bool? isDisableCloudMessagePreHook = false,
- bool? isDisableCloudMessagePostHook = false,
Implementation
Future<V2TimValueCallback<V2TimMessage>> sendMessage({
String? id,
V2TimMessage? message,
void Function(String msgID)? onSyncMsgID,
required String? receiver,
required String? groupID,
int priority = 0,
bool onlineUserOnly = false,
OfflinePushInfo? offlinePushInfo,
bool isExcludedFromUnreadCount = false,
bool isExcludedFromLastMessage = false,
bool? isSupportMessageExtension = false,
bool? isExcludedFromContentModeration = false,
bool needReadReceipt = false,
String? cloudCustomData,
String? localCustomData,
bool? isDisableCloudMessagePreHook = false,
bool? isDisableCloudMessagePostHook = false,
}) async {
if (!TIMManager.instance.isInitSDK()) {
return V2TimValueCallback<V2TimMessage>(code: TIMErrCode.ERR_SDK_NOT_INITIALIZED.value, desc: "sdk not init");
}
// 如果传入的 message 为空,则从 messageIDMap 中获取
if (message == null) {
if (id != null) {
message = messageIDMap[id];
if (message == null) {
print('sendMessage, messageIDMap cannot find message');
return V2TimValueCallback<V2TimMessage>.fromBool(false, 'messageIDMap cannot find message');
} else {
message.priority = priority;
message.isOnlineOnly = onlineUserOnly;
message.isExcludedFromUnreadCount = isExcludedFromUnreadCount;
message.isExcludedFromLastMessage = isExcludedFromLastMessage;
message.isSupportMessageExtension = isSupportMessageExtension;
message.needReadReceipt = needReadReceipt;
message.isDisableCloudMessagePreHook = isDisableCloudMessagePreHook;
message.isDisableCloudMessagePostHook = isDisableCloudMessagePostHook;
if (cloudCustomData != null) {
message.cloudCustomData = cloudCustomData;
}
if (localCustomData != null) {
message.localCustomData = localCustomData;
}
if (offlinePushInfo != null) {
message.offlinePushInfo = offlinePushInfo;
}
}
} else {
print('sendMessage, messageIDMap cannot find message');
return V2TimValueCallback<V2TimMessage>.fromBool(false, 'messageIDMap cannot find message');
}
}
if ((receiver == null || receiver.isEmpty) && (groupID == null || groupID.isEmpty) ) {
print('sendMessage, receiver and groupID cannot be empty at the same time');
return V2TimValueCallback<V2TimMessage>.fromBool(false, 'sendMessage, receiver and groupID cannot be empty at the same time');
}
String convID = "";
TIMConvType timConvType = TIMConvType.kTIMConv_Group;
if (groupID != null && groupID.isNotEmpty) {
convID = groupID;
timConvType = TIMConvType.kTIMConv_Group;
} else {
convID = receiver!;
timConvType = TIMConvType.kTIMConv_C2C;
}
String userData = Tools.generateUserData('sendMessage');
Completer<V2TimValueCallback<V2TimMessage>> completer = Completer();
void handleApiCallback(Map jsonResult) {
V2TimValueCallback<V2TimMessage> callbackResult = V2TimValueCallback<V2TimMessage>.fromJson(jsonResult);
if (callbackResult.data != null) {
callbackResult.data!.id = id;
}
completer.complete(callbackResult);
}
NativeLibraryManager.timApiValueCallback2Future(userData, handleApiCallback);
Pointer<Char> pConvID = Tools.string2PointerChar(convID);
Pointer<Char> pMsgParam = Tools.string2PointerChar(json.encode(message!.toJson()));
Pointer<Void> pUserData = Tools.string2PointerVoid(userData);
Pointer<Char> pMessageID = NativeLibraryManager.bindings.DartSendMessage(pConvID, timConvType, pMsgParam, pUserData);
String messageIDDart = Tools.pointerChar2String(pMessageID);
if (onSyncMsgID != null) {
onSyncMsgID.call(messageIDDart);
}
// 转发消息给多个人的时候,会重复使用一个 id
if (false == (message.isForwardMessage ?? false)) {
messageIDMap.remove(id);
}
return completer.future;
}