【问题标题】:Android WorkManager Worker can not be injected using Dagger Hilt `@WorkerInject`无法使用 Dagger Hilt `@WorkerInject` 注入 Android WorkManager Worker
【发布时间】:2020-06-13 03:46:22
【问题描述】:

我正在尝试遵循 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()
    }
}

注意:AppNavigatorNavigationModule 中提供为 @Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator.
另请注意,将AppNavigator 替换为AppDatabase(即@Singleton)并没有帮助。

这就是我从MainActivity开始工作的方式

    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:解决方案

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

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

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

【问题讨论】:

标签: android androidx dagger-hilt


【解决方案1】:

更新(2021 年 3 月 24 日):

由于androidx.work-*版本2.6.0-alpha01WorkManager使用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

【讨论】:

  • 谢谢伊恩,我不知道这一点。我已在 Manifest 中应用该规则,并使用“Analyze APK”验证记录已从合并的 Manifest 中删除。但是,我仍然遇到同样的错误。抱歉,我可能错过了一些我看不到的愚蠢的东西。
  • 我遇到了同样的问题,这个答案解决了,谢谢。如果 the Hilt+WorkManager guide 中包含此片段(或某些指示)可能会有所帮助?
  • @jorgeavilae 感谢这里的更新。奇怪的是它仍然不适合我。作为一种解决方法,Inject dependencies in classes not supported by Hilt 中提到的解决方案对我有用。不过,我更喜欢使用 Hilt 提供的 @WorkerInject 解决方案。
  • @jorgeavilae - 我强烈建议您提交an issue against the documentation 以便添加链接。
  • 我在issuetracker.google.com/issues/158891026提交了文档混淆问题
【解决方案2】:

我遇到了类似的问题,但就我而言,我必须使用带有 @Provides 注释的 Hilt 模块,而不是 @Binds 注释。我无法使用 @Binds 注释注入 Hilt 模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多