Jetpack Compose类型安全导航出现意外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) }
额外验证点
- 确认
category._id.toHexString()返回的确实是非空字符串,可在HomeScreen的onClick中添加日志输出验证值是否正确 - 确保
Items类的@Serializable注解来自kotlinx.serialization.Serializable,避免因序列化注解错误导致参数传递失败
内容的提问来源于stack exchange,提问作者Stillswarm
相关产品推荐
相关产品推荐

