簡體   English   中英

無法使用 @WorkerInject 在 WorkManager 中注入 @Binds Hilt 依賴項

[英]Couldn't inject @Binds Hilt Dependencies in WorkManager using @WorkerInject

我嘗試使用以下代碼構建

遵循 Hilt-WorkManager 官方文檔

工人class

class StartJobWorker @WorkerInject constructor(
    @Assisted appContext: Context,
    @Assisted workerParams: WorkerParameters,
    private val startJobUseCase: StartJobUseCase,
) : CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        val jobId: Long = inputData.getLong(AppConstant.JOB_ID, 0)
        return when (val workResult: WorkResult = startJobUseCase(jobId)) {
            is WorkResult.Success<*> -> Result.success()
            is WorkResult.Failure<*> -> Result.failure()
            WorkResult.Retry -> Result.retry()
        }
    }

}

刀柄模塊

@Module
@InstallIn(ActivityComponent::class)
abstract class UseCaseModule {

    @ActivityScoped
    @Binds
    abstract fun bindStartJobUseCase(startJobUseCaseImpl: StartJobUseCaseImpl): StartJobUseCase

}

依賴抽象

interface StartJobUseCase {
    suspend operator fun invoke(jobId: Long): WorkResult
}

依賴實現

class StartJobUseCaseImpl @Inject constructor(
    private val startJobRepository: StartJobRepository
) : StartJobUseCase {

    override suspend fun invoke(jobId: Long): WorkResult {
        return startJobRepository.startJob(jobId)
    }

}

我在編譯中收到以下錯誤消息。

error: [Dagger/MissingBinding] com.example.domain.StartJobUseCase cannot be provided without an @Provides-annotated method.

請讓我知道這個問題的解決方案。

正如 EpicPandaForce 所說,用 ApplicationComponent 交換 ActivityComponent 並刪除 UseCaseModule class 中的 @ActivityScoped 解決了這個問題。

刀柄模塊

@Module
@InstallIn(ActivityComponent::class)
abstract class UseCaseModule {

    @Binds
    abstract fun bindStartJobUseCase(startJobUseCaseImpl: StartJobUseCaseImpl): StartJobUseCase

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM