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

Hos*_*han 17 android androidx dagger-hilt

我正在尝试遵循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]
Run Code Online (Sandbox Code Playgroud)

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

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

注意:AppNavigatorNavigationModule 中作为 @Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator.
另请注意,替换AppNavigatorAppDatabasewhich is@Singleton无济于事。

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

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

不确定究竟是什么问题。


更新:我创建了一个全新的 Android 项目来重现它。该项目附加到 issue#158843197GitHub Gist提供了所有关键文件源代码快照(如果您想快速查看)。


更新#2:解决方案

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

kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
Run Code Online (Sandbox Code Playgroud)

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

ian*_*ake 18

更新(2021 年 3 月 24 日):

androidx.work-*version 开始2.6.0-alpha01WorkManager用于androidx.startup初始化 WorkManager。
有关对 的新要求更改AndroidManifest.xml,请查看答案。

原答案:

由于每WorkManager的配置和初始化文件,使用Configuration.Provider你的界面Application,则必须删除默认初始化

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

否则,默认初始化程序仍将运行,清除您的自定义初始化及其HiltWorkerFactory.

  • @jorgeavilae - 我强烈建议您提交[针对文档的问题](https://issuetracker.google.com/issues/new?component=192697&amp;template=845603),以便可以添加链接。 (3认同)
  • 我在 https://issuetracker.google.com/issues/158891026 提交了文档混乱问题 (2认同)