Jetpack Compose导航报错:CreationExtras缺少SAVED_STATE_REGISTRY_OWNER_KEY
解决Jetpack Compose导航中的
SAVED_STATE_REGISTRY_OWNER_KEY错误 错误原因
这个异常是因为ViewModel或导航操作未获取到有效的SavedStateRegistryOwner——这是Jetpack组件保存状态的核心依赖,通常由NavHost或Activity提供。结合你使用Hilt导航的场景,常见触发原因包括:
- ViewModel未通过
hiltViewModel()正确注入,导致缺失状态注册表关联 - 导航操作时机不当(比如在Composable未完成初始化、或ViewModel的
init块中直接调用navigate) - 依赖版本不兼容(你使用的
hilt-navigation-compose:1.0.0是较旧版本,可能和其他Jetpack库版本不匹配)
具体修复步骤
1. 确保ViewModel通过hiltViewModel()获取
在Composable中必须使用Hilt提供的hiltViewModel()获取ViewModel,而非普通的viewModel():
// 正确写法 val viewModel: YourViewModel = hiltViewModel()
这会自动将NavHost的SavedStateRegistryOwner关联到ViewModel,避免状态注册表缺失问题。
2. 调整导航触发时机
不要在ViewModel的init块或Composable初始渲染阶段直接执行导航,改用LaunchedEffect包裹逻辑,确保在Composable稳定后执行:
val viewModel: YourViewModel = hiltViewModel() val navController = rememberNavController() LaunchedEffect(viewModel.isAuthenticated) { if (viewModel.isAuthenticated) { navController.navigate(Screen.Profile.route) { // 可选:添加导航行为,比如清除回退栈 popUpTo(Screen.Login.route) { inclusive = true } } } }
LaunchedEffect会监听isAuthenticated的变化,仅在状态改变且Composable活跃时执行导航。
3. 更新依赖版本(可选但推荐)
旧版本的hilt-navigation-compose可能存在兼容性问题,建议升级到最新稳定版,同时确保相关依赖版本匹配:
// 升级hilt导航依赖 implementation "androidx.hilt:hilt-navigation-compose:1.1.0" // 确保hilt核心版本一致 implementation "com.google.dagger:hilt-android:2.48" kapt "com.google.dagger:hilt-android-compiler:2.48"
4. 检查NavHost配置
确保NavHost在正确上下文(如Activity的Composable内容)中创建,并使用rememberNavController():
@Composable fun AppNavHost() { val navController = rememberNavController() NavHost( navController = navController, startDestination = Screen.Login.route ) { composable(Screen.Login.route) { LoginScreen(viewModel = hiltViewModel(), navController = navController) } composable(Screen.Profile.route) { ProfileScreen(viewModel = hiltViewModel()) } } }
内容的提问来源于stack exchange,提问作者Always Learner
相关产品推荐
相关产品推荐

