You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose类型安全导航出现意外Null值,请求排查

问题排查:Compose Navigation传递非空参数却收到null

问题场景

在Compose Navigation导航逻辑中,从Home页面向Items页面传递非空String类型的categoryId,但在Items页面接收时该值为null。

相关代码

MyApp.kt(导航配置)

navigation<MainApp>(startDestination = Home) {
    composable<Home> {
        atHomeScreen = true
        HomeScreen(
            onClick = { categoryId ->
                navController.navigate(Items(categoryId = categoryId))
            }
        )
    }

    composable<Items>(
    ) { backStackEntry ->
        val categoryId: String = backStackEntry.toRoute()
        atHomeScreen = false
        ItemsScreen(categoryId)
    }
    //...
}

HomeScreen.kt(触发跳转的页面)

@Composable
fun HomeScreen(
    onClick: (String) -> Unit,
    modifier: Modifier = Modifier
) {
    val viewModel: HomeViewModel = hiltViewModel()
    val categories by viewModel.itemCategories.collectAsStateWithLifecycle()

    Column(
        modifier = modifier
            .fillMaxSize()
            .verticalScroll(rememberScrollState()),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.spacedBy(12.dp)
    ) {
        categories.forEach { category ->
            DataCard(
                title = category.title,
                imageUrl = category.imageUrl,
                onCardClick = {
                    onClick(category._id.toHexString())
                }
            )
        }
    }
}

Routes.kt(路由定义)

@Serializable
data class Items(val categoryId: String)    //definition of Items route

问题原因

接收参数的方式错误:backStackEntry.toRoute()方法返回的是**Items路由对象实例**,而非直接的categoryId字符串。直接将其赋值给String类型变量,会因类型不匹配导致运行时转换失败,最终得到null值。

解决方案

修改Items页面的参数接收逻辑,先获取完整的Items路由对象,再从中提取categoryId:

composable<Items> { backStackEntry ->
    // 先获取Items路由实例
    val itemsRoute = backStackEntry.toRoute<Items>()
    // 从实例中取出非空的categoryId
    val categoryId: String = itemsRoute.categoryId
    atHomeScreen = false
    ItemsScreen(categoryId)
}

额外验证点

  1. 确认category._id.toHexString()返回的确实是非空字符串,可在HomeScreen的onClick中添加日志输出验证值是否正确
  2. 确保Items类的@Serializable注解来自kotlinx.serialization.Serializable,避免因序列化注解错误导致参数传递失败

内容的提问来源于stack exchange,提问作者Stillswarm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:33:18