【问题标题】:Hilt and WorkManager error : lateinit property WorkerFactory has not been initializedHilt 和 WorkManager 错误:lateinit 属性 WorkerFactory 尚未初始化
【发布时间】:2021-08-05 19:45:24
【问题描述】:

我正在尝试向 WorkManager 注入 Hilt。 首先我实现文档:

使用类中的@HiltWorker 注解和Worker 对象的构造函数中的@AssistedInject 注入一个Worker。您只能在 Worker 对象中使用 @Singleton 或无范围绑定。您还必须使用 @Assisted 注释 Context 和 WorkerParameters 依赖项:

 @HiltWorker
 class RetreiveQuestionWorkManager @AssistedInject constructor(
    @Assisted val appContext : Context,
    @Assisted val workerParameters: WorkerParameters,
    val questionDao: QuestionDao,
    val questionCacheMapper: QuestionCacheMapper)
    : CoroutineWorker(appContext, workerParameters)  {
    ... 
    }

然后我从文档中应用了这个:

然后,让您的 Application 类实现 Configuration.Provider 接口,注入 HiltWorkFactory 的实例,并将其传递给 WorkManager 配置,如下所示:

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

    @Inject lateinit var workerFactory: HiltWorkerFactory

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

}

最后,我从文档中处理了这个注释:

注意:由于这会自定义 WorkManager 配置,因此您还必须按照 WorkManager 文档中的规定从 AndroidManifest.xml 文件中删除默认初始化程序。

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

但我收到此错误:

    java.lang.RuntimeException: Unable to start activity ComponentInfo{mohalim.contest.alarm/mohalim.contest.alarm.ui.splash.SplashActivity}: kotlin.UninitializedPropertyAccessException: lateinit property workerFactory has not been initialized
...
     Caused by: kotlin.UninitializedPropertyAccessException: lateinit property workerFactory has not been initialized
...

【问题讨论】:

  • 您使用的是哪个 workmanager 版本?您是否将应用程序类添加到清单中?您是否添加了所有必要的依赖项?
  • 我正在使用工作管理器版本 2.7.0-alpha05,我将我的应用程序类添加到清单中,这是我使用的刀柄依赖项 implementation("com.google.dagger:hilt-android :$hilt_version") kapt("com.google.dagger:hilt-android-compiler:$hilt_version") 实现("androidx.hilt:hilt-work:1.0.0") kapt("androidx.hilt:hilt-compiler :1.0.0")

标签: android kotlin android-workmanager dagger-hilt


【解决方案1】:

您初始化 workmanager 和 workmanagerfactory 的方式仅在 workmanager 版本 2.5.X 之前有效。随着 Workmanager Version 2.6.x-alphaX 的更新,这发生了变化,现在 workmanager 正在使用 androidx.startup 来初始化 WorkManager。

您有两个选择:要么降级回我建议的 2.5.0,因为这是当前的稳定版本,要么更改初始化工作管理器的方式。

如果您想保留您的版本,请更改您的 Android 清单如下:

<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.impl.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />
 </provider>

 <!-- If you want to disable android.startup completely. -->
 <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove">
 </provider>

此外,请确保您具有以下依赖项:

implementation "com.google.dagger:hilt-android:$dagger_hilt_version"
kapt "com.google.dagger:hilt-compiler:$dagger_hilt_version"
kapt 'androidx.hilt:hilt-compiler:1.0.0'
implementation "androidx.hilt:hilt-work:1.0.0"

implementation 'androidx.work:work-runtime-ktx:2.7.0-alpha05'

【讨论】:

  • 我尝试降级到 2.5.0 版本并通过 androidx.work.impl.WorkManagerInitializer 而不是 androidx.startup.InitializationProvider 删除清单中工作管理器的默认初始化,版本为 2.5.0 然后我' m 已经在使用当前版本 2.7.0-alpha05 的 androidx.startup.InitializationProvider。同样的问题仍然存在,谢谢。
  • 也许开始一个新项目,测试你初始化workmanager等的方式是否有效,然后尝试在你现有的项目中做同样的事情。
  • 最后,在开始一个新项目并将旧项目的所有代码移动到新项目后,它就像一个魅力。我不知道是什么问题,但我认为这是因为将android studio更新到arctic fox版本而发生的。谢谢。
【解决方案2】:

解决了 2 个问题使它对我有用:

  1. Remove the default initializer
  2. 通过@EntryPoint 重构HiltWorkerFactory 注入,如here 所述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2020-12-31
    • 2021-06-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多