在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评论中的链接可能会提供一些解释。