如何在返回MagicLinkScreen时保留用户输入的邮箱?
解决导航返回时邮箱输入状态丢失的问题
核心问题原因
你当前在OpenMailsScreen中使用navController.navigate(AuthScreen.MagicLinkLogin.route)返回,这会在导航栈中新增一个全新的MagicLinkLogin页面实例,而非回到之前用户输入邮箱的那个页面。新页面会创建新的MagicLinkLoginViewModel实例,导致之前输入的邮箱状态丢失。
解决方案步骤
1. 修正返回逻辑:使用popBackStack回到原页面
将导航代码中OpenMailsScreen的navigateBack替换为popBackStack(),这样会直接回到导航栈中前一个存在的MagicLinkLogin页面,原页面的ViewModel会被保留,输入的邮箱状态自然不会丢失。
修改导航代码中的OpenMails composable部分:
composable( route = AuthScreen.OpenMails.route, ) { backStackEntry -> val email = backStackEntry.arguments?.getString("email") ?: "" OpenMailsScreen( email = email, // 替换navigate为popBackStack navigateBack = { navController.popBackStack() }, navigateToMailsApp = { navigateToMailsApp() }, viewModel = hiltViewModel<OpenMailsViewModel>(), ) }
2. 保留SavedStateHandle用于进程死亡恢复
你当前对SavedStateHandle的使用是正确的,它可以在进程意外死亡时恢复邮箱状态。正常导航返回时不需要依赖它,但保留这部分代码可以提升异常场景下的用户体验。
额外优化:避免重复创建页面实例
确保所有返回操作都使用popBackStack()而非navigate()回到之前的页面,这是Jetpack Navigation的标准返回方式,能避免栈中堆积重复页面,同时保留原有页面的状态。
验证效果
修改后,当用户从OpenMailsScreen点击返回,会直接回到之前输入邮箱的MagicLinkLoginScreen,输入框中的邮箱内容会完整保留;如果遇到进程意外重启,SavedStateHandle会自动恢复之前输入的邮箱。
内容的提问来源于stack exchange,提问作者Fatima Jamal
相关产品推荐
相关产品推荐

