使用Hilt注入CoroutineWorker:无法实例化worker。

16

有些问题已经被问过,但对我没有用。一开始我使用的是最新版本的 Work Manager,即 2.7 Alpha 3,但我降级了,因为它只与 Android 12 预览 SDK 兼容。但错误仍然存在!
由于这些依赖项包含在 Worker 的构造函数中,它无法实例化该 Worker。在添加它们之前,它是可以工作的,但如果我不能添加它们,那么 Hilt 没有任何好处,所以情况如下:

清单文件中不包含任何与 Work Manager 相关的配置!

应用程序类:

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

@Inject
lateinit var workerFactory: HiltWorkerFactory

override fun getWorkManagerConfiguration() =
    Configuration.Builder()
        .setWorkerFactory(workerFactory)
        .build()

}

工人:

@HiltWorker
class DriveSyncWorker @AssistedInject constructor(
    @Assisted val context: Context,
    @Assisted workerParams: WorkerParameters,
    val dependency: StorageHelper,
)
< p > < em > 注意:它没有使用 HiltWorkFactory! < p > 错误:
E/WM-WorkerFactory: Could not instantiate com.wakaztahir.timeline.utils.workers.DriveSyncWorker
    java.lang.NoSuchMethodException: com.wakaztahir.timeline.utils.workers.DriveSyncWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
        at java.lang.Class.getConstructor0(Class.java:2332)
        at java.lang.Class.getDeclaredConstructor(Class.java:2170)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:244)
        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:923)
E/WM-WorkerWrapper: Could not create Worker com.wakaztahir.timeline.utils.workers.DriveSyncWorker

Gradle:

implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"

def work_version = "2.6.0-alpha02"
implementation "androidx.work:work-runtime-ktx:$work_version"
implementation 'androidx.hilt:hilt-work:1.0.0-beta01'
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

相关链接:

无法使用Hilt注入协程Worker
使用Hilt注入协程Worker


在我的情况下,我使用的是ksp而不是kapt。这导致了问题,因为低于1.1.0版本的hilt-compiler不支持它。这是发布说明的链接:https://developer.android.com/jetpack/androidx/releases/hilt#version_110_2 - undefined
3个回答

31

如果您正在使用的是2.6.0-alpha01版本以上的工作管理器,那么工作管理器版本2.6.0-alpha01以上将使用启动初始化程序 点击此处了解更多信息。

请将此提供程序添加到您的应用程序的AndroidManifest.xml中:

<application ... >

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

</application>

1
但是你正在从应用程序覆盖getWorkManagerConfiguration(因为Hilt需要它),因此你需要将该提供程序添加到清单中。 - xatok
我做了,但它仍然出现错误!文档中指出:注意:由于这个自定义了WorkManager的配置,你还必须按照WorkManager文档中的说明从AndroidManifest.xml文件中删除默认的初始化器。 https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager - Shenanigans1
谢谢你的帮助! - Shenanigans1
它修复了我在使用WorkManager版本2.7.0-rc01时遇到的问题。 - Oscar Gallon

31

您的gradle文件缺少额外的kapt定义:

// When using Kotlin.
kapt("androidx.hilt:hilt-compiler:1.0.0")

// When using Java.
annotationProcessor("androidx.hilt:hilt-compiler:1.0.0")

请查看文档


我正在使用 kapt "com.google.dagger:hilt-compiler:$hilt_version",但不用担心,问题已经通过上面的答案解决了,请检查编辑。 - Shenanigans1
9
我正在撰写这篇答案,因为我昨天遇到了同样的问题,只有 kapt "com.google.dagger:hilt-compiler:$hilt_version" 是不够的。添加额外的 kapt("androidx.hilt:hilt-compiler:1.0.0") 后一切正常。因此,我的解决方案是同时使用两个 kapt 定义以及接受的清单设置。 - petin
1
好的回答。值得一提的是,在多模块项目中,应将此添加到包含“Worker”实现的模块build.gradle文件中。 - Ivan Wooll

2

我正在使用带有Hilt的WorkManager 2.7.1。根据文档,自WorkManager 2.6以来,您应该将启动提供程序中的[androidx.work.WorkManagerInitializer]替换为[androidx.work.impl.WorkManagerInitializer]。

    <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:node="merge">
        <!-- If you are using androidx.startup to initialize other components -->
        <meta-data
            android:name="androidx.work.WorkManagerInitializer"
            android:value="androidx.startup"
            tools:node="remove" />
    </provider>

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