提问者:小点点

Hilt和WorkManager错误:lateinit属性WorkerFactory尚未初始化


我试图注入WorkManager与Hilt.首先我实现留档:

在类中使用 @HiltWorker 注释注入 Worker 并在 Worker 对象的构造函数中使用@AssistedInject。只能在 Worker 对象中使用@Singleton或无作用域绑定。您还必须使用@Assisted注释上下文和辅助角色参数依赖项:

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

然后我应用这个从留档:

然后,让Application类实现Configuration。提供程序接口,注入HiltWorkFactory的实例,并将其传递到WorkManager配置中,如下所示:

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

    @Inject lateinit var workerFactory: HiltWorkerFactory

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

}

最后,我从留档照顾这张纸条:

注意:由于这会自定义工作管理器配置,因此您还必须从 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
...

共3个答案

匿名用户

您初始化workmanager和workmanagerfactory的方式仅适用于workmanager版本2.5.X。随着workmanager版本2.6.X-alphaX的更新,这一点发生了变化,现在workmanager正在使用androidx。启动以初始化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 个问题使它对我有用:

  1. 删除默认初始化程序
  2. 如此处所述,通过@Entry Point重构HiltWorker工厂注入

匿名用户

正如@sanya5791所提到的,如果添加/更改启动提供程序不起作用,那么另一个要尝试的解决方案是添加HiltWorkerFactoryEntry Point,以防在on创建之前调用了WorkerCon人和它可以按照以下方式完成,以防链接不起作用,完整的解决方案如下所示:

    < li >更改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>