android - 注入(inject)工作类时无法实例化工作人员

标签 android android-room dagger-hilt

我正在为我的项目使用 android 应用程序启动、刀柄和空间。我在尝试排队工作时遇到错误:

com.test E/WM-WorkerFactory: Could not instantiate com.test.RefreshWorker
    java.lang.NoSuchMethodException: com.test.RefreshWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters] 

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data
        android:name="androidx.work.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />
    <meta-data
        android:name="com.test.RefreshInitializer"
        android:value="androidx.startup" />
</provider>

我的应用类:

@HiltAndroidApp
class TestApplication: Application(), Configuration.Provider {
   @Inject
   lateinit var workerFactory: HiltWorkerFactory

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

我的 worker :

@HiltWorker
class RefreshWorker @AssistedInject constructor(
   @Assisted context: Context,
   @Assisted params: WorkerParameters,
   private val repository: Repository,
) : CoroutineWorker(context, params) {
   override suspend fun doWork(): Result = try {
      repository.fetch()
      Result.success()
   } catch (error: Throwable) {
      Result.failure()
   }
}

最后是我对工作和刀柄的依赖: def hilt_version = '2.41' def work_version = '2.7.1' 实现“com.google.dagger:hilt-android:$hilt_version” kapt "com.google.dagger:hilt-compiler:$hilt_version" 实现 'androidx.hilt:hilt-work:1.0.0' kapt 'androidx.hilt:hilt-compiler:1.0.0' annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0' 实现“androidx.work:work-runtime-ktx:$work_version”

如果我不注入(inject)自己的依赖项,一切都很好。而且我已经仔细检查了我的依赖项。知道我错过了什么吗?

编辑:

如果有帮助,我注意到在我的应用程序类中没有调用 getWorkManagerConfiguration()。为了验证我的 list 是否正确使用了正确的类,我确实看到在我的应用程序类中调用了 onCreate() 。调试 WorkManager 初始化代码,看起来 WorkManager 仍然通过 android 启动来初始化工作管理器。我现在已经检查了我的 list 几次,我相信它正确地从应用程序启动中删除了工作管理器。

最佳答案

解决方案:

检查你的gradle: Injecting CoroutineWorker with Hilt : Could not instantiate woker

在这里查看: https://github.com/google/dagger/issues/2601 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration

在gradle中添加这个:

    kapt("androidx.hilt:hilt-compiler:1.0.0")

以前我没有 () 但有空格。

在 list 中

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

申请

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

    @Inject
    lateinit var workerFactory: HiltWorkerFactory

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

我的 gradle 版本:

    hilt_version = "2.37"
    hilt_deps = [
            classpath_plugin: "com.google.dagger:hilt-android-gradle-plugin:$hilt_version",
            hilt            : "com.google.dagger:hilt-android:$hilt_version",
            compiler        : "com.google.dagger:hilt-android-compiler:$hilt_version"
    ]


    kapt hilt_deps.compiler
    kapt("androidx.hilt:hilt-compiler:1.0.0")
    implementation hilt_deps.hilt
    implementation 'androidx.hilt:hilt-work:1.0.0'
    lifecycle_version = "2.4.0-alpha02"
    lifecycle_deps = [
            viewmodel: "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version",
            lifecycle: "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version",
            compiler : "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    ]

检查你是否有 @Inject constructor() 和你想要提供的类。

关于android - 注入(inject)工作类时无法实例化工作人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72419550/

相关文章:

android - 如何使用 XML 布局以外的方式绘制自定义 View 装饰?

android - 多屏幕支持完整性检查

android - 房间迁移失败回退android

安卓分页 3 : How to change parameters of RemoteMediator

android - 有没有一种简单的方法可以在 Ionic2 中存储密码?

android - 异步任务进度对话框显示太晚

kotlin - 如何使用 Room `` `@Ignore ``` 注释忽略 kotlin 委托(delegate)属性

android - Hilt Fragments 必须附加到 @AndroidEntryPoint Activity。找到 : class

android - 如何去除 Dagger Hilt 依赖注入(inject)周期

android - 具有多个接口(interface)实现的 Dagger Hilt