Hilt + Worker NoSuchMethodException:<init> [类 android.content.Context,类 androidx.work.WorkerParameters]

问题描述 投票:0回答:2

我在尝试使用 Hilt 和 WorkManager 对工作进行排队时遇到异常:

Could not instantiate my.example.package.widget.ExampleWorker
                 java.lang.NoSuchMethodException: my.example.package.widget.ExampleWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
                    at java.lang.Class.getConstructor0(Class.java:3325)
                    at java.lang.Class.getDeclaredConstructor(Class.java:3063)
                    at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95)
                    at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:243)
                    at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:145)
                    at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
                    at java.lang.Thread.run(Thread.java:1012)
14:26:51.737  E  Could not create Worker my.example.package.widget.ExampleWorker

这是我的 Worker 类:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
    @Assisted private val context: Context,
    @Assisted workerParameters: WorkerParameters,
    private val exampleUseCase: ExampleUseCase
) : CoroutineWorker(context, workerParameters) {

    companion object {

        private val uniqueWorkName = ExampleWorker::class.java.simpleName

        fun enqueue(context: Context) {
            val manager = WorkManager.getInstance(context)
            val requestBuilder = PeriodicWorkRequestBuilder<ExampleWorker>(
                Duration.ofMinutes(15)
            )

            manager.enqueueUniquePeriodicWork(
                uniqueWorkName,
                ExistingPeriodicWorkPolicy.UPDATE,
                requestBuilder.build()
            )
        }
    }

    override suspend fun doWork(): Result {
        exampleUseCase.invoke()
        return Result.success()
    }
}

我的 Hilt 应用程序:

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

    // https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager
    @Inject
    lateinit var workerFactory: HiltWorkerFactory

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

在 AndroidManifest.xml 文件中,我按照教程删除了默认初始化程序: https://developer.android.com/guide/background/persistent/configuration/custom-configuration#remove-default

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

我在我的工作人员中注入的简化类:

class ExampleUseCase @Inject constructor() {
    operator fun invoke() {}
}

这是我的依赖项:

implementation("com.google.dagger:hilt-android:2.48.1")
ksp("com.google.dagger:hilt-android-compiler:2.48.1")

implementation("androidx.hilt:hilt-work:1.0.0")
ksp("androidx.hilt:hilt-compiler:1.0.0")

implementation("androidx.work:work-runtime-ktx:2.8.1")
implementation("androidx.work:work-runtime:2.8.1")

Gradle 插件版本:8.1.1,Kotlin 版本:1.9.10

我在更新项目中的几个依赖项后遇到此异常,例如Gradle Plugin从7.4.1到8.1.1,Kotlin从1.8.0到1.9.10,Hilt从2.44.2到2.48.1,以及编译SDK 从 33 到 34 等等。

我尝试降级 Hilt,但是,在这样做时,我遇到了新的异常,我认为这可能是由于所有这些升级的库之间的版本不兼容引起的。

如果我从工作构造函数中删除

exampleUseCase
参数,
NoSuchMethodException
就会被解析。但是,我在
doWork()
方法中需要此字段。我尝试将其注入为
lateinit var
,但它在调用时尚未初始化。

我已经检查了很多文档,但我仍然遗漏了一些东西。我将非常感谢任何帮助!

android kotlin dagger-hilt android-workmanager coroutineworker
2个回答
2
投票

我认为这是 KSP 中的一个错误,请参阅 this


0
投票

您必须添加两个编译器:

ksp(libs.hilt.compiler)
ksp(libs.hilt.ext.compiler)

libs.versions.toml:

hilt = "2.53.1"
hiltExt = "1.2.0"

hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
hilt-ext-compiler = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "hiltExt" }
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.