无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker

Android WorkManager Worker can not be injected using Dagger Hilt `@WorkerInject`(无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker)
本文介绍了无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试按照https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager中的指南操作,但遇到以下错误

E/WM-WorkerFactory: Could not instantiate com.example.android.hilt.ExampleWorker
    java.lang.NoSuchMethodException: <init> [class android.content.Context, class androidx.work.WorkerParameters]

为了重现该问题,我在Dagger Hilt Example Repo中添加了GUDE中的示例代码

class ExampleWorker @WorkerInject constructor(
    @Assisted appContext: Context,
    @Assisted workerParams: WorkerParameters,
    val workerDependency: AppNavigator
) : Worker(appContext, workerParams) {
    override fun doWork(): Result {
        Log.d("WORKER", "I am the worker, got dependency: $workerDependency")
        return Result.success()
    }
}
注意:AppNavigator在NavigationModule中以 @Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
另请注意,将AppNavigator替换为AppDatabase无济于事。

这就是我如何从MainActivity

启动Worker
    override fun onStart() {
        super.onStart()
        enqueueWorker(applicationContext)
    }

    private fun enqueueWorker(context: Context) {
        val request = OneTimeWorkRequestBuilder<ExampleWorker>().build()
        WorkManager.getInstance(context).enqueue(request)
    }

不确定到底出了什么问题。


更新:我已经创建了一个全新的Android项目来复制它。项目是attached to the issue#158843197。所有密钥文件源代码快照都位于GitHub Gist(如果您想快速查看)。


更新2:解决方案

除了Ianmentioned below,问题是我错过了app/build.gradle中的Gradle依赖(在aosp#158843197中提到)

kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'

Worker的依赖项注入现在正在工作。

推荐答案

更新(2021年3月24日):

androidx.work-*版本2.6.0-alpha01开始,WorkManager使用androidx.startup初始化WorkManager。
有关对AndroidManifest.xml所需的新更改,请检查this答案。

原始答案:

根据WorkManager Configuration and Initialization documentation,要在Application上使用Configuration.Provider接口,您必须remove the default initializer:

<!-- In your AndroidManifest.xml -->
<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

否则,默认初始值设定项仍将运行,并清除您的自定义初始化及其HiltWorkerFactory

这篇关于无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Get an event when UIBarButtonItem menu is displayed(显示UIBarButtonItem菜单时获取事件)
iOS: Send multiple actions to a bar button(IOS:向一个栏按钮发送多个动作)