Moh*_*ALI 5 android kotlin android-workmanager dagger-hilt
我正在尝试将 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) {
...
}
Run Code Online (Sandbox Code Playgroud)
然后我从文档中应用了这个:
然后,让您的 Application 类实现 Configuration.Provider 接口,注入 HiltWorkFactory 的实例,并将其传递到 WorkManager 配置中,如下所示:
@HiltAndroidApp
class MyApp : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
Run Code Online (Sandbox Code Playgroud)
最后,我处理文档中的这条注释:
注意:由于这会自定义 WorkManager 配置,因此您还必须按照 WorkManager 文档中的指定从 AndroidManifest.xml 文件中删除默认初始值设定项。
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove">
</provider>
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
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
...
Run Code Online (Sandbox Code Playgroud)
您初始化 workmanager 和 workmanagerfactory 的方式仅在 workmanager 版本 2.5.X 之前有效。随着 Workmanager 版本2.6.x-alphaX的更新,这种情况发生了变化,现在 workmanager 使用 androidx.startup 来初始化 WorkManager。
这里有两个选择:要么降级到我建议的 2.5.0,因为这是当前的稳定版本,要么更改初始化 Workmanager 的方式。
如果您想保留您的版本,请更改您的 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>
Run Code Online (Sandbox Code Playgroud)
或者
<!-- If you want to disable android.startup completely. -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove">
</provider>
Run Code Online (Sandbox Code Playgroud)
此外,请确保您具有以下依赖项:
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'
Run Code Online (Sandbox Code Playgroud)