在Android中使用Hilt后无法创建viewmodel实例
这是我的在Android中使用Hilt后无法创建viewmodel实例,android,kotlin,android-jetpack,dagger-hilt,Android,Kotlin,Android Jetpack,Dagger Hilt,这是我的AllFilesListViewModel类 class AllFilesListViewModel @ViewModelInject constructor( private val pdfItemRepository: PdfItemRepository):ViewModel() { } @Singleton class PdfItemRepository @Inject constructor(private val pdfItemDao: PdfItemDao){
AllFilesListViewModel
类
class AllFilesListViewModel @ViewModelInject constructor(
private val pdfItemRepository: PdfItemRepository):ViewModel() {
}
@Singleton
class PdfItemRepository @Inject constructor(private val pdfItemDao: PdfItemDao){
}
这里是PdfItemRepository
类
class AllFilesListViewModel @ViewModelInject constructor(
private val pdfItemRepository: PdfItemRepository):ViewModel() {
}
@Singleton
class PdfItemRepository @Inject constructor(private val pdfItemDao: PdfItemDao){
}
对于pdfItemDao
。我创建了一个名为DatabaseModule
的模块。以下是守则-
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {
@Provides
fun provideDatabase(@ApplicationContext context: Context):AppDatabase{
return AppDatabase.getDataBase(context)
}
@Provides
fun providePdfItemDao(database:AppDatabase):PdfItemDao{
return database.pdfItemDao()
}
}
这里是片段类AllFilesFragment.kt
,我使用的是viewModel
@AndroidEntryPoint
class AllFilesFragment:Fragment(){
private lateinit var binding:AllFilesFragmentBinding
private val viewModel by viewModels<AllFilesListViewModel>()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = AllFilesFragmentBinding.inflate(inflater,container,false)
context?: return binding.root
initThings()
subscribeUi()
return binding.root
}
}
这是由AndroidX生命周期、AndroidX核心、AndroidX活动和AndroidX片段之间的版本不匹配造成的 仅当可以覆盖
getDefaultViewModelProviderFactory
时,Hilt才起作用
只有当该方法实际存在时才是这样,而当依赖项过期时则不是这样。也就是说,您的androidx.fragment
低于1.2.0,您的androidx.activity
低于1.1.0
使用此选项,它将起作用:
implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.fragment:fragment-ktx:1.2.5"
implementation "androidx.core:core-ktx:1.3.0"
implementation "androidx.activity:activity:1.1.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0"
但目前,这正是我成功的原因:
implementation 'com.google.dagger:dagger:2.28'
kapt 'com.google.dagger:dagger-compiler:2.28'
// hilt
implementation 'com.google.dagger:hilt-android:2.28-alpha'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
kaptTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
连同
apply plugin: 'dagger.hilt.android.plugin'
及
我在应用程序的build.gradle中使用了
kapt'androidx.hilt:hilt编译器:1.0.0-alpha01'
后,这个问题就解决了。我已经添加了kapt“com.google.dagger:hilt安卓编译器:2.28-alpha”
。顺便说一句,我还是不明白这两个词的区别。如果有人知道的话。请给我解释一下。我以前遇到过这个问题,我通过将savedstatehold
传递给视图模型的主构造函数来解决它。class AuthViewModel @ViewModelInject constructor(@Assisted private val savedState: SavedStateHandle) : ViewModel()
我用刀柄的时候会发生这种情况,对我来说,问题的原因是我忘了在片段类的顶部添加
@AndroidEntryPoint
,对于那些检查了上述所有解决方案但仍然无法工作的人,最后的检查是删除Build
文件夹和rebuild
项目,这将迫使编译器重新创建匕首依存关系图
在引擎盖下
在我的例子中,我用
@AndroidEntryPoint
注释了我的活动,但仍然面临同样的问题。我已删除了我的build
文件夹和rebuild
项目,并且它正在按预期工作。@ViewModelInject在较新的hilt版本中不推荐使用
使用HiltViewModel
@HiltViewModel
class AllFilesListViewModel @Inject constructor(
val pdfItemRepository: PdfItemRepository)
) : ViewModel() {
}
我已经更新了依赖项。但它仍然不起作用。当我打开刀柄生成的文件时也是如此。有一个被覆盖的getDefaultViewModelFactory。要支持
@ViewModelInject
,还必须启用代码生成deps。这解决了我的问题。想想我浪费了这么多时间,因为我没有仔细看一下这些文件@Rajesh,我认为theapache64评论中的链接可能会提供一些解释。