Android中使用Dagger Hilt实现Activity与Fragment共享ViewModel报错解决
问题描述
我希望在Android中使用Dagger Hilt实现Activity与其Fragment共享ViewModel,以下是我的代码:
Activity代码
class MyActivity : AppCompatActivity(){ private val viewModel : SharedViewModel by viewModels() //*** //*** //*** }
Fragment代码
class MyFragment : Fragment(){ private val viewModel : SharedViewModel by activityViewModels() //*** //*** //*** }
仅在Activity中创建ViewModel时一切正常,但尝试在其Fragment中创建时出现如下错误:
Caused by: android.view.InflateException: (...) Error inflating class fragment SharedFragment.getViewModel(SharedFragment.kt:23) SharedFragment.onViewCreated(SharedFragment.kt:23) Caused by: java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` MyActivity.onCreate(MyActivity.kt:60)
解决方法
这个错误是因为Hilt依赖注入上下文配置不全,ViewModel创建时缺少必要的SavedStateRegistryOwner参数,按以下步骤修复:
给Activity和Fragment添加Hilt入口注解
必须确保宿主Activity和关联Fragment都标记@AndroidEntryPoint,让Hilt能正确注入依赖:@AndroidEntryPoint class MyActivity : AppCompatActivity(){ private val viewModel : SharedViewModel by viewModels() // ... 其他代码 }@AndroidEntryPoint class MyFragment : Fragment(){ private val viewModel : SharedViewModel by activityViewModels() // ... 其他代码 }检查ViewModel的Hilt注解
你的SharedViewModel必须使用@HiltViewModel注解,且构造函数通过@Inject注入,包含必要的SavedStateHandle:@HiltViewModel class SharedViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, // 其他需要注入的依赖 ) : ViewModel() { // ... ViewModel业务逻辑 }确认Fragment的ViewModel访问时机
不要在Fragment的onCreateView之前(比如构造函数、onAttach早期阶段)调用by activityViewModels(),确保在onViewCreated或之后访问,或者直接在属性声明时使用(只要Fragment已正确关联到Activity)。验证全局Hilt配置
确保你的Application类添加了@HiltAndroidApp注解,这是Hilt初始化的核心:@HiltAndroidApp class MyApplication : Application() { // ... 应用初始化逻辑 }同时检查项目build.gradle文件,确认已正确引入Hilt插件和依赖库。
内容的提问来源于stack exchange,提问作者GrimPloughman
相关产品推荐
相关产品推荐

