使用KOIN配置WorkManager

5

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

implementation "org.koin:koin-androidx-workmanager:2.2.0-rc-4"

我的工作类如下所示

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 {
    ...
    }

我目前所做的是禁用默认初始化程序。
<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

我的worker模块设置如下:

val workerModule = module {
    worker { NotificationsScheduler(get(), get(), get(), get()) }
}

这是添加到startKoin DSL使用的列表中的内容。我还使用了workManagerFactory() DSL来设置工厂。

startKoin {
        androidContext(this@MyApplication)
        workManagerFactory()
        modules(koinModules)
    }

我遇到的问题是,应用程序启动时崩溃并出现异常:
 Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'androidx.work.WorkerParameters'. Check your definitions!
1个回答

6
只需使用NotificationsScheduler类实现KoinComponent,并通过inject()注入AppCoroutineDispatchers和GetTaskUseCase实例,代码如下:
class NotificationsScheduler(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters), KoinComponent {
    private val dispatchers: AppCoroutineDispatchers by inject()
    private val getTaskUseCase: GetTaskUseCase by inject()
}

在工作模块中:

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

请确保已经提供了 GetTaskUseCase 和 AppCoroutineDispatchers 的实例。

更新:Koin 2.2.0版本发布

implementation "org.koin:koin-androidx-workmanager:2.2.0"

更新你的Worker类。
 class NotificationsScheduler(private val dispatchers: AppCoroutineDispatchers,private val getTaskUseCase: GetTaskUseCase,context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters), KoinComponent {
       
  }

这里是您需要的内容:

val workerModule = module {
        worker { NotificationsScheduler(get(),get(),androidContext(),get())  }
    }

感谢@p72b


1
已接受的答案。从主构造函数中删除我的参数,并通过实现KoinComponent并使用inject()进行注入即可解决问题。 koin-workmanager的文档有点误导性。 - lmiskovic
1
请查看此帖子 https://medium.com/koin-developers/whats-next-with-koin-2-2-3-0-releases-6c5464ae5e3d看起来您现在正在使用错误的方式,并且可以再次删除org.koin:koin-androidx-workmanager导入。 - p72b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接