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

原学程将引见没法应用Dagger Hilt`@WorkerInject`注进Android WorkManager Worker的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker 教程 第1张

成绩描写

我正在测验考试依照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()
 }
}

留意:AppNavigator在NavigationModule中以
@Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
另请留意,将AppNavigator调换为AppDatabase杯水车薪。

这便是我怎样从MainActivity

开动Worker

 override fun onStart() {
  super.onStart()
  enqueueWorker(applicationContext)
 }

 private fun enqueueWorker(context: Context) {
  val request = OneTimeWorkRequestBuilder<ExampleWorker>().build()
  WorkManager.getInstance(context).enqueue(request)
 }

没有肯定究竟出了甚么成绩。


革新:我曾经创立了1个齐新的Android项目去复制它。项目是attached to the issue#一五88四三一九七。一切稀钥文件源代码快照皆位于GitHub Gist(假如您想疾速检查)。


革新二:处理计划

除Ianmentioned below,成绩是我错过了app/build.gradle中的Gradle依附(在aosp#一五88四三一九七中提到)

kapt 'androidx.hilt:hilt-compiler:一.0.0-alpha0一'

Worker的依附项注进如今正在任务。

推举谜底

革新(二0二一年三月二四日):

androidx.work-*版原二.六.0-alpha0一开端,WorkManager应用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

佳了闭于没法应用Dagger Hilt`@WorkerInject`注进Android WorkManager Worker的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。