Jetpack Compose页面导航报错:缺失SAVED_STATE_REGISTRY_OWNER_KEY
解决Jetpack Compose导航时的
CreationExtras must have a value by SAVED_STATE_REGISTRY_OWNER_KEY错误 错误原因
这个错误核心是ViewModel创建时缺少SavedStateRegistryOwner上下文,多见于Hilt与Jetpack Navigation结合时的配置疏漏,或是ViewModel获取方式不符合规范。
解决步骤
1. 补全Hilt基础配置
- 确保Application类标注
@HiltAndroidApp:
@HiltAndroidApp class MyApp : Application()
- 确保承载Compose的Activity标注
@AndroidEntryPoint:
@AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { YourAppTheme { val navController = rememberNavController() SetupNavGraph(navController) } } } }
2. 修正ViewModel获取方式
在MainScreen/DetailsScreen中,必须用hiltViewModel()获取ViewModel,禁止手动实例化或错误使用ViewModelProvider:
@Composable fun MainScreen(navController: NavHostController) { // 正确获取ViewModel val viewModel: MainViewModel = hiltViewModel() // 页面交互逻辑 Button(onClick = { navController.navigate(Screens.DetailScreen.route) }) { Text("跳转至详情页") } }
3. 确认NavHostController初始化位置
rememberNavController()必须在具备生命周期的Composable层级(如Activity的setContent内部)调用,确保它能关联到Activity这个合法的SavedStateRegistryOwner。
4. 检查ViewModel依赖的注入合法性
如果NotificationCompat.Builder是通过Hilt注入的,需确保Module中提供了正确的实例:
@Module @InstallIn(SingletonComponent::class) object NotificationModule { @Provides fun provideNotificationManager(@ApplicationContext context: Context): NotificationManagerCompat { return NotificationManagerCompat.from(context) } @Provides fun provideNotificationBuilder(@ApplicationContext context: Context): NotificationCompat.Builder { return NotificationCompat.Builder(context, "YOUR_CHANNEL_ID") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("默认标题") } }
验证流程
完成配置后重新编译运行:
- 确认App能正常启动进入MainScreen
- 点击导航按钮跳转至DetailScreen,检查是否无崩溃
内容的提问来源于stack exchange,提问作者Lokmane Kerboua
相关产品推荐
相关产品推荐

