Jetpack Compose Navigation中NoSuchMethodError问题求助
针对 Screen 类属性调用报错的问题
- 检查
Screen密封类/对象的定义,确保screen属性是不可变的无参Composable函数类型。错误写法通常是用var定义可变属性,会生成不必要的setScreen()方法,而navigation-compose期望的是纯Composable函数实例。修正示例:sealed class Screen(val route: String) { object ExampleScreen : Screen("example_route") { val screen: @Composable () -> Unit = { ExampleScreen() } } } - 若开启R8混淆,需在混淆规则中保留Composable相关方法,避免被误裁剪:
-keepclassmembers class * { @androidx.compose.runtime.Composable <methods>; } -keepnames class kotlin.jvm.functions.Function0
针对 NavHostController.getBackQueue() 报错的问题
- 在Kotlin中直接使用
backQueue属性替代getBackQueue()方法。navigation-compose的Java风格getter会被Kotlin自动映射为属性,显式调用getter会因版本兼容问题导致方法找不到:// 错误写法 navController.getBackQueue() // 正确写法 navController.backQueue - 确保所有Compose相关依赖版本统一,比如
compose-ui、compose-material都使用1.5.2版本,避免版本不一致引发的方法缺失。
通用排查步骤
- 用版本统一管理确保依赖对齐,在根
build.gradle中配置:ext { compose_version = '1.5.2' navigation_compose_version = '2.7.3' kotlin_version = '1.8.22' } - 执行
./gradlew clean build清理缓存,避免旧字节码残留导致的方法不匹配。 - 临时关闭R8混淆(设置
minifyEnabled false),若问题消失,说明是混淆规则遗漏导致的方法裁剪。
内容的提问来源于stack exchange,提问作者Kochez
相关产品推荐
相关产品推荐

