使用Hilt获取Bundle时遇SAVED_STATE_REGISTRY_OWNER_KEY缺失错误
问题:调用BizBundle打开SceneDetailActivity时触发
CreationExtras must have a value by SAVED_STATE_REGISTRY_OWNER_KEY错误 问题描述
通过Hilt获取Bundle,调用BizBundle打开SceneDetailActivity时触发错误:CreationExtras must have a value by SAVED_STATE_REGISTRY_OWNER_KEY,已添加相关依赖但问题未解决。
Gradle依赖配置
implementation "androidx.navigation:navigation-compose:2.7.0" implementation 'androidx.fragment:fragment-ktx:1.6.1' implementation 'androidx.activity:activity-compose:1.7.2' implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' implementation 'androidx.savedstate:savedstate:1.2.1' implementation 'androidx.lifecycle:lifecycle-common:2.6.1' implementation 'androidx.activity:activity-ktx:1.7.2'
完整报错堆栈
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.smartlife.ninovas, PID: 8861 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.smartlife.ninovas/com.thingclips.smart.scene.construct.detail.SceneDetailActivity}: java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3431) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7664) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` at androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle(SavedStateHandleSupport.kt:91) at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.kt:90) at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:116) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53) at com.thingclips.smart.scene.construct.detail.SceneDetailViewModelFactoryKt.createViewModel(SceneDetailViewModelFactory.kt:14) at com.thingclips.smart.scene.construct.detail.SceneDetailActivity.onCreate(SceneDetailActivity.kt:184) at android.app.Activity.performCreate(Activity.java:8023) at android.app.Activity.performCreate(Activity.java:8007) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3404) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7664) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
调用代码
IThingSceneBusinessService iThingSceneBusinessService = MicroContext.findServiceByInterface(IThingSceneBusinessService.class.getName()); if(null != iThingSceneBusinessService && HomeModel.getHomeID() != 0) { iThingSceneBusinessService.addSceneBean(MainPage.this, HomeModel.getHomeID(), 1234); }
解决方案
- 检查Activity继承关系:确保
SceneDetailActivity继承自AppCompatActivity或ComponentActivity(这两个类实现了SavedStateRegistryOwner接口,是SavedStateHandle必需的)。如果该Activity是第三方SDK提供的,可尝试升级SDK版本,或者确认启动时传递的上下文是否正确。 - 验证Hilt配置:
- 应用的Application类必须添加
@HiltAndroidApp注解; SceneDetailActivity必须添加@AndroidEntryPoint注解,确保Hilt能正确注入ViewModel所需的依赖。
- 应用的Application类必须添加
- 确认启动上下文:调用
addSceneBean时传递的MainPage.this是Activity实例,而非Application Context,因为Application不实现SavedStateRegistryOwner,无法提供所需的SavedStateRegistry。 - 统一依赖版本:检查项目中是否存在不同版本的
lifecycle、savedstate相关库,使用统一版本避免冲突。比如将所有lifecycle相关依赖统一为同一版本(如2.6.1)。 - 检查ViewModel创建方式:确保
SceneDetailViewModel添加了@HiltViewModel注解,且通过正确的方式获取ViewModel(如by viewModels()),而非自定义工厂导致的初始化错误。
内容的提问来源于stack exchange,提问作者Eko Freshh
相关产品推荐
相关产品推荐

