initMessages method
Implementation
void initMessages(RCIMIWConversation con, {Function()? onSuccess}) {
_cancelClearUnreadRequest();
_cancelMessageRequests();
_cancelMessageEditOperations();
_cancelEditedDraftOperations();
_invalidateReferenceRefreshes();
_con = con;
_captureSession();
_sessionInvalid = false;
_latestModifiedMessages.clear();
_messageEditOperationIds.clear();
_messageEditSourceCache.clear();
_referenceMessageStates.clear();
_conversationInitialized = true;
final requestId = ++_messageRequestId;
final targetEngine = _sessionEngine;
if (targetEngine == null) {
_messages = [];
notifyListeners();
return;
}
RCIMIWMessageOperationPolicy policy =
RCIMIWMessageOperationPolicy.localRemote;
if (connectionStatus == RCIMIWConnectionStatus.networkUnavailable ||
connectionStatus == RCIMIWConnectionStatus.unconnected ||
connectionStatus == RCIMIWConnectionStatus.suspend ||
connectionStatus == RCIMIWConnectionStatus.timeout ||
connectionStatus == RCIMIWConnectionStatus.unknown) {
policy = RCIMIWMessageOperationPolicy.local;
}
var completed = false;
Timer? timeoutTimer;
bool completeRequest() {
if (completed) return false;
completed = true;
timeoutTimer?.cancel();
_messageRequestCancellations.remove(requestId);
return true;
}
void finishWithError(int code) {
if (!completeRequest() ||
!_isMessageRequestCurrent(targetEngine, requestId)) {
return;
}
notifyListeners();
RCIMWrapperPlatform.instance
.writeLog('RCKChatProvider initMessages', '', code, 'onError');
}
timeoutTimer = Timer(
_requestCompletionTimeout,
() => finishWithError(-1),
);
_messageRequestCancellations[requestId] = () {
completeRequest();
};
unawaited(() async {
try {
final immediateCode = await targetEngine.getMessages(
con.conversationType ?? RCIMIWConversationType.invalid,
con.targetId ?? '',
con.channelId,
0,
RCIMIWTimeOrder.before,
policy,
20,
callback: IRCIMIWGetMessagesCallback(
onSuccess: (t, _, __) {
if (completed) return;
if (!_isMessageRequestCurrent(targetEngine, requestId)) {
completeRequest();
return;
}
if (!completeRequest()) return;
// 将消息列表倒置
_messages = _mergeLatestModifiedMessages(
t?.reversed ?? const <RCIMIWMessage>[],
);
_queryReadReceiptMessages(_messages);
// Android Kit 会在引用消息本地扩展信息回调后再提交首屏列表,
// 远端结果则继续通过刷新回调更新当前页面。Flutter 先赋值,
// 但把首次通知推迟到本地阶段完成(最多等待一秒)。
unawaited(() async {
await _refreshReferenceMessages(
_messages,
waitForInitialStage: true,
);
if (!_isMessageRequestCurrent(targetEngine, requestId)) return;
notifyListeners();
WidgetsBinding.instance.addPostFrameCallback((_) {
messageListScrollToBottom();
});
onSuccess?.call();
RCIMWrapperPlatform.instance.writeLog(
'RCKChatProvider initMessages',
'',
0,
'onSuccess t: ${t?.length}');
}());
},
onError: (code) {
finishWithError(code ?? -1);
},
),
);
if (immediateCode != 0) finishWithError(immediateCode);
} catch (_) {
finishWithError(-1);
}
}());
}