Jetpack Compose中SavedStateHandle传递Parcelable对象遇空值问题
问题原因
你把Parcelable对象存到了当前页面的BackStackEntry的SavedStateHandle里,但ViewModel依赖的是目标页面(TodoEdit)的SavedStateHandle,两者不是同一个实例,所以ViewModel拿不到数据。路由里能拿到是因为你取的是previousBackStackEntry(即原页面)的SavedStateHandle,和存数据的地方一致。
解决方案
修改导航函数,将数据存入目标页面的BackStackEntry的SavedStateHandle中:
fun NavController.navigateToEditTodo(todo: TodoUI) { // 获取TodoEdit页面的BackStackEntry val targetBackStackEntry = getBackStackEntry(Screen.TodoEdit.route) // 将数据存入目标页面的SavedStateHandle targetBackStackEntry.savedStateHandle.set(TodoDetailsArgs.TODO_DETAIL, todo) navigate(Screen.TodoEdit.route) }
验证修改
修改后,ViewModel的TodoDetailsArgs会从自身所属的TodoEdit页面的SavedStateHandle中读取数据,就能拿到正确的TodoUI对象了。
额外说明
- 确保
Screen.TodoEdit.route的定义没有包含动态参数占位符(比如"todo_edit/{id}"),如果有需要调整,避免和SavedStateHandle的传参冲突。 - 你的
TodoUI数据类和TodoDetailsArgs的写法是正确的,无需修改。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

