使用 KOIN 设置 WorkManager

lmi*_*vic 5 android kotlin koin android-workmanager

我正在尝试设置工作管理器来完成一些工作,但在初始化时遇到问题。我正在使用 KOIN workmaanger dsl

implementation "org.koin:koin-androidx-workmanager:2.2.0-rc-4"
Run Code Online (Sandbox Code Playgroud)

我的工人阶级看起来像这样

class NotificationsScheduler(
    private val dispatchers: AppCoroutineDispatchers,
    private val getTaskUseCase: GetTaskUseCase,
    private val context: Context,
    private val workerParameters: WorkerParameters
) : Worker(context, workerParameters) {

    override fun doWork(): Result {
    ...
    }
Run Code Online (Sandbox Code Playgroud)

到目前为止我所做的是禁用默认初始化程序

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)

我的工作模块是这样设置的

val workerModule = module {
    worker { NotificationsScheduler(get(), get(), get(), get()) }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到 startKoin DSL 中使用的列表中。我还使用 workManagerFactory() DSL 来设置工厂。

startKoin {
        androidContext(this@MyApplication)
        workManagerFactory()
        modules(koinModules)
    }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当应用程序因异常启动时它会崩溃:

 Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'androidx.work.WorkerParameters'. Check your definitions!
Run Code Online (Sandbox Code Playgroud)

Dea*_*ean 6

只需NotificationsScheduler class实现 KoinComponent 并注入 AppCoroutineDispatchers 和 GetTaskUseCase 实例,inject()如下所示:

class NotificationsScheduler(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters), KoinComponent {
    private val dispatchers: AppCoroutineDispatchers by inject()
    private val getTaskUseCase: GetTaskUseCase by inject()
}
Run Code Online (Sandbox Code Playgroud)

在工作模块中:

val workerModule = module {
    worker { OneTimeWorkRequestBuilder<AlarmNotificationHandleWorker>().run{
         WorkManager.getInstance(androidContext())
         .enqueueUniqueWork(UUID.randomUUID().toString()
         ,ExistingWorkPolicy.APPEND, this)
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

确保您已提供 GetTaskUseCase 和 AppCoroutineDispatchers 实例 更新Koin 2.2.0 版本

implementation "org.koin:koin-androidx-workmanager:2.2.0"
Run Code Online (Sandbox Code Playgroud)

更新你的 Worker 类

 class NotificationsScheduler(private val dispatchers: AppCoroutineDispatchers,private val getTaskUseCase: GetTaskUseCase,context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters), KoinComponent {
       
  }
Run Code Online (Sandbox Code Playgroud)

你在这里:

val workerModule = module {
        worker { NotificationsScheduler(get(),get(),androidContext(),get())  }
    }
Run Code Online (Sandbox Code Playgroud)

谢谢@p72b