Compose Dialog打开IME时点击按钮触发‘Ime callback not found’错误求助
Ime callback not found错误排查(Dialog键盘打开时点击按钮触发)
场景
Dialog的Column布局内包含文本框和Material3 Button,文本框试过android.widget及androidx.compose.material3下的多种组件。该Dialog的Composable通过navController.navigate从其他Composable跳转进入。按钮点击逻辑:通过Repository调用ViewModel发起API请求,之后调用navController.popBackStack()。
问题
当文本框的IME键盘处于打开状态时,点击按钮会抛出错误:
Ime callback not found. Ignoring unregisterReceivedCallback. callbackId: 77948589
键盘未打开时点击按钮无此错误。
已尝试方案
- 在按钮点击开头调用
focusManager.clearFocus() - 设置文本框
keyboardOptions的imeAction = ImeAction.None - 参考过相关社区问题,但未找到可行解决方法
应用环境
- 纯Compose项目
- Android SDK 14.0(API Level 34 Revision 3)
- Gradle 8.6
- Kotlin Compiler 1.9.0,语言版本2.0,API版本2.0,JVM目标1.8
- 依赖:ViewModel 2.8.0、Navigation 2.7.7、Retrofit 2.11.0、Moshi 1.14.0(其余为默认,项目为3天前创建的空活动模板)
解决方法
方法1:延迟执行页面返回
在调用popBackStack()前增加短暂延迟,给IME回调留足注销时间:
Button(onClick = { // 执行API请求逻辑 viewModel.submitInput(inputText) // 延迟100ms后返回上一页 CoroutineScope(Dispatchers.Main).launch { delay(100) navController.popBackStack() } }) { Text("提交") }
方法2:利用DisposableEffect在Dialog销毁时清焦点
在Dialog的Composable内部添加DisposableEffect,确保Dialog销毁前强制清除输入框焦点:
val focusManager = LocalFocusManager.current DisposableEffect(Unit) { onDispose { focusManager.clearFocus() } }
方法3:通过ViewModel状态触发返回
避免在按钮点击时直接执行返回,改用ViewModel的状态通知,确保焦点清理完成后再返回:
// ViewModel中定义返回状态 val shouldNavigateBack = MutableStateFlow(false) // 提交逻辑 fun submitInput(text: String) { // 发起API请求 repository.postData(text) // 请求完成后标记需要返回 shouldNavigateBack.value = true } // Composable中监听状态 LaunchedEffect(viewModel.shouldNavigateBack) { viewModel.shouldNavigateBack.collect { goBack -> if (goBack) { focusManager.clearFocus() navController.popBackStack() viewModel.shouldNavigateBack.value = false } } } // 按钮点击 Button(onClick = { viewModel.submitInput(inputText) }) { Text("提交") }
方法4:调整Navigation版本
该错误在Navigation 2.7.x版本存在偶现情况,可尝试降级到2.7.5或升级到2.8.0及以上版本,部分开发者反馈版本调整后问题消失。
内容的提问来源于stack exchange,提问作者S R Samy
相关产品推荐
相关产品推荐

