输入状态
输入状态可让用户直观地了解其他用户是否正在键入消息。在对方用户键入内容时,标题栏会一直显示「对方正在输入」,直到用户发送消息或完全删除文本。如果用户停止打字超过 6 秒,该提示也会消失。SDK 在输入框中有内容变化时,默认向对端用户发送一条正在输入的状态消息,包含消息内容对象 TypingStatusMessage
(类型标识:RC:TypSts
)。
提示
- 基于会话界面-Page(
ConversationPage
)包含了标题栏显示正在输入状态的实现。 - 基于会话组件-Component(
ConversationComponent
)构建的会话页面,请自行实现标题栏输入状态的展示与更新。

局限
- 只支持单聊会话。
- 因无法确定用户的输入操作,该功能可能会产生大量状态消息,为防止消息发送频繁,默认在 6 秒钟内的多次状态变化,只产生一条输入状态消息。
- 该功能可能会导致大量状态消息,如不需要此功能建议关闭。
用法
如果使用 IMKit 会话界面-Page(ConversationPage
)集成,该功能默认可用,无需额外处理。
在自定义会话页面监听输入状态
IMKit 的会话组件-Component不含标题栏实现。如果使用这个方式构建自定义会话页面,您需要自行实现输入状态的展示与更新。IMKit SDK 内部已经处理好逻辑,在输入框中有内容变化时,SDK 会向目标用户发送一条正在输入的状态消息。接收方可根据该状态消息,实现类似「对方正在输入」的提示。
应用程序仅需要在自定义会话页面注册监听器,在收到回调通知时更新标题栏。
- 在自定义会话页面中注册输入状态的监听器。
建议添加监听后,在合适的时机移除,避免内存泄露。如果在页面中监听,建议在aboutToAppear
调用,在 aboutToDisappear
移除监听。
private typingStatusListener: TypingStatusListener = {
onTypingStatusChange: (conId: ConversationIdentifier, typingStatusList: List<TypingStatus>) => {
//当输入状态的会话类型和targetID与当前会话一致时,才需要显示
if (!conId || !StringChecker.equals(conId.targetId, this.conId.targetId) ||
conId.conversationType !== this.conId.conversationType) {
//不是当前会话
return;
}
// 输入状态列表为空,当前会话没有用户正在输入,标题栏仍显示原来标题
if (!typingStatusList || typingStatusList.length <= 0) {
// 展示原标题
return
}
// 有值代表对方在输入内容 匹配对方正在输入的是文本消息还是语音消息
let typingStatus = typingStatusList[0] as TypingStatus
if (typingStatus.objectName === TextMessageObjectName) {
// 设置标题:对方正在输入...
} else if (typingStatus.objectName === HQVoiceMessageObjectName
|| typingStatus.objectName === VoiceMessageObjectName) {
// 设置标题:对方正在说话...
}
}
}
// 添加监听
RongIM.getInstance().messageService().addTypingStatusListener(this.typingStatusListener)
// 移除监听
RongIM.getInstance().messageService().removeTypingStatusListener(this.typingStatusListener)
当对方正在输入时,本端会触发 onTypingStatusChange
,回调里携带有正在输入的用户列表。当对方停止输入时,该监听还会触发一次,此时回调里的输入用户列表为空。这时您需要取消「正在输入」的显示,并显示原有的会话标题栏。