无法使用 Hilt 注入 WorkManager 构造函数

8

我正在开发一个Android应用程序,尝试在工作管理器构造函数中使用hilt,但它无法正常工作并显示以下错误:

2020-08-18 19:01:09.989 18125-18759/com. E/WM-WorkerFactory: Could not instantiate example.android.app.database.DeleteNotesWorker
    java.lang.NoSuchMethodException: example.android.app.database.DeleteNotesWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
        at java.lang.Class.getConstructor0(Class.java:2328)
        at java.lang.Class.getDeclaredConstructor(Class.java:2167)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:242)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

这是工作者类:

class DeleteNotesWorker @WorkerInject constructor(
    @Assisted context: Context,
    @Assisted workerParams: WorkerParameters,
    private val dao : NotesDao
) : CoroutineWorker(context, workerParams) {

    override suspend fun doWork(): Result {
        dao.deleteNotesInTrash()
         return Result.success()
    }


}

应用程序模块:

@Module
@InstallIn(ApplicationComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun getNotesDatabase(@ApplicationContext context: Context) =
        Room.databaseBuilder(context, NotesDatabase::class.java, NotesDatabase.DB_NAME).build()

    @Singleton
    @Provides
    fun getDoa(db: NotesDatabase) = db.notesDao()

}

应用程序类:

@HiltAndroidApp
class App : Application(), Configuration.Provider {

    @Inject
    lateinit var workerFactory: HiltWorkerFactory

    override fun getWorkManagerConfiguration(): Configuration {
        return Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
    }


}

build.gradle(应用程序):

 dependencies {

.......

 //Hilt
    implementation "com.google.dagger:hilt-android:2.28-alpha"
    kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
    
    //Hilt with workManager
    implementation 'androidx.hilt:hilt-work:1.0.0-alpha02'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
}

build.gradle (项目文件):

 dependencies {
        classpath 'com.android.tools.build:gradle:4.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

    ............

        //Hilt
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'

        ..........
    }

在这种情况下我做错了什么吗?如果是的话,请协助我纠正。


请发布您相关的 build.gradle 依赖项。 - Nitrodon
你解决了这个问题吗? - Niyas
这个问题在这篇帖子中被Google员工回答了。https://dev59.com/F1IG5IYBdhLWcg3w5GEu 谢谢。 - user12741503
3个回答

11
根据这份文档,您需要将此代码粘贴到AndroidManifest中,以使Hilt的WorkManager Inject正常工作。
<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

我之前也遇到了和你一样的问题,这个方法解决了它。


4

@Attila提供的答案适用于WorkManager 2.6版本及以下。

对于2.6+版本,您需要按照以下方式删除WorkManagerInitializer节点:

 <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">

    <meta-data
        android:name="androidx.work.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />
 </provider>

WorkManager文档提供了更多关于此的信息。


2

如果你和我一样是个菜鸟,请别忘了在依赖中加入kapt 'androidx.hilt:hilt-compiler:1.0.0'

如果缺少androidx hilt编译器扩展,你也会遇到同样的异常,并且不会收到任何构建警告或错误信息。


我浪费了3个小时来解决问题,而你救了我的一天! - Nidhin Rejoice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接