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

2024-04-19

我正在尝试遵循以下指南https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager 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]

为了重现该问题,我添加了指南中的示例代码匕首柄示例存储库 https://github.com/googlecodelabs/android-hilt/tree/solution

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提供于导航模块 https://github.com/googlecodelabs/android-hilt/blob/solution/app/src/main/java/com/example/android/hilt/di/NavigationModule.kt as @Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator.
另请注意,替换AppNavigator with 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)
    }

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


UPDATE:我创建了一个全新的 Android 项目来重现它。该项目是附加到问题#158843197 https://issuetracker.google.com/issues/158843197#comment4。所有密钥文件源代码快照可以在GitHub 要点 https://gist.github.com/amardeshbd/33fe07607c557b8a8f5efff9625f9c72(如果您想快速查看)。


更新#2:解决方案

在伊恩之上如以下所说的 https://stackoverflow.com/a/62355423/132121,问题是我错过了 Gradle 依赖项app/build.gradle(在aosp#158843197 https://issuetracker.google.com/issues/158843197)

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

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


更新(2021 年 3 月 24 日):

Since androidx.work-*版本2.6.0-alpha01, WorkManager uses androidx.startup初始化 WorkManager。
对于新的所需更改AndroidManifest.xml, check this https://stackoverflow.com/a/67165871/3438172 answer.

原答案:

根据WorkManager 配置和初始化文档 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#on-demand,使用Configuration.Provider您的界面Application, 你必须删除默认初始化程序 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#remove-default:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android WorkManager Worker 无法使用 Dagger Hilt `@WorkerInject` 注入 的相关文章

随机推荐