@InstallIn,只能与@DefineComponent注解的类一起使用,但发现:[com.abc.xyz.AppClass]

Fer*_*han 8 android mvvm viewmodel kotlin dagger-hilt

根据 Hilt 的文档,我完成了所有步骤

将类路径添加到项目模块

classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
Run Code Online (Sandbox Code Playgroud)

添加插件

plugins {
    id "kotlin-kapt"
    id("dagger.hilt.android.plugin")
}
Run Code Online (Sandbox Code Playgroud)

添加依赖项

dependencies {
    implementation("com.google.dagger:hilt-android:$hilt_version")
    kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
}
Run Code Online (Sandbox Code Playgroud)

带注释的应用程序类,在我的例子中为 AppClass,带有@HiltAndroidApp. 带注释的 Activity 和有关片段@AndroidEntryPoint

创建模块为

@InstallIn(AppClass::class)
@Module
object DatabaseModule {

    @Provides
    @Singleton
    fun provideAppDB(application: Application): AppDB {
        return AppDB.getDatabase(application)
    }

    @Provides
    @Singleton
    fun provideMediaDao(appDB: AppDB): MediaDao {
        return appDB.downloadMediaDao()
    }
}
Run Code Online (Sandbox Code Playgroud)

将其注入 ViewModel 类中

@HiltViewModel
class DownloadViewModel @Inject constructor(
    private val mediaDao: MediaDao
): ViewModel() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是在完成所有步骤之后,我收到错误消息“@InstallIn,只能与@DefineComponent注释的类一起使用,但发现:[com.abc.xyz.AppClass]”

Fer*_*han 24

按照Codelab中的定义,我替换了这个

@InstallIn(AppClass::class)
Run Code Online (Sandbox Code Playgroud)

有了这个

@InstallIn(SingletonComponent::class)
Run Code Online (Sandbox Code Playgroud)

它正在发挥作用。

  • 但为什么?也许更多的解释会有用? (2认同)

Fan*_*dez 6

就我而言,我犯了一个结束职业生涯的错误,我因一整天都被一个简单的拼写错误所困扰而受到了应有的惩罚!

我没有使用SingletonComponent::class,而是将其错误拼写为Singleton::class

//worst error of my career
@Module
@InstallIn(Singleton::class)
object AppModule { ... }
Run Code Online (Sandbox Code Playgroud)

我改为 SingletonComponent::class 并绕过了错误。

//changed it to this
@Module
@InstallIn(SingletonComponent::class)
object AppModule { ... }
Run Code Online (Sandbox Code Playgroud)