Jetpack Compose跨模块调用组件报错java.lang.NoSuchMethodError求助
排查Android Compose Dialog库的NoSuchMethodError异常
异常核心原因
抛出java.lang.NoSuchMethodError说明调用方期望的方法签名与library模块编译生成的方法签名不匹配,结合Compose组件特性,核心问题集中在library模块的编译配置缺失,以及部分代码结构错误。
具体问题及修复方案
1. basic-dialogs模块缺失Compose编译配置
library模块未启用Compose构建特性,也未指定Compose编译器版本,导致Composable函数未被正确编译,生成的方法参数(如Composer、位置标记Int参数)与app模块调用时的期望不一致,直接引发找不到方法的异常。
修复操作:
修改basic-dialogs模块的build.gradle,在android代码块内补充Compose相关配置:
android { // 保留原有配置 buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion compose_version } }
2. BasicDialog组件结构错误
BasicDialog中用Surface包裹Dialog的写法不符合Compose规范:Dialog本身是顶层Composable,用于创建独立对话框窗口,外层无需Surface,应将Surface移至Dialog内部作为内容容器,同时补充排版控件避免界面错乱。
修复后的BasicDialog代码:
@OptIn(ExperimentalComposeUiApi::class) @Composable fun BasicDialog( title: String = "", confirmButtonText: String, onDismiss: () -> Unit, onConfirmClick: () -> Unit, content: @Composable () -> Unit ) { Dialog( onDismissRequest = onDismiss, properties = DialogProperties( dismissOnBackPress = true, dismissOnClickOutside = true, usePlatformDefaultWidth = false ), ) { Surface( shape = MaterialTheme.shapes.medium, color = MaterialTheme.colors.surface, modifier = Modifier.padding(4.dp) ) { Column(modifier = Modifier.padding(16.dp)) { if (title.isNotEmpty()) { Text(title, style = MaterialTheme.typography.h6) Spacer(Modifier.height(8.dp)) } content() Spacer(Modifier.height(16.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End ) { TextButton(onClick = onDismiss) { Text(text = stringResource(id = R.string.dialog_cancel), fontSize = 16.sp) } TextButton(onClick = onConfirmClick) { Text(text = confirmButtonText, fontSize = 16.sp) } } } } } }
3. 依赖一致性验证
当前项目已通过根gradle的compose_version统一管理版本,需执行Clean Project -> Rebuild Project,确保所有模块重新编译,避免依赖缓存导致的版本不一致问题。
内容的提问来源于stack exchange,提问作者Raj Narayanan
相关产品推荐
相关产品推荐

