You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WorkManagerApplication集成Hilt遇参数匹配错误求助

Hilt集成WorkManager时参数不匹配错误排查

错误信息

error: [androidx.hilt.work.WorkerAssistedFactory.create(android.content.Context, androidx.work.WorkerParameters)] 工厂方法中的参数必须与com.app.workmanagersample.ui.WorkManagerCall中的@Assisted参数匹配。

问题代码

@HiltAndroidApp
class WorkManagerApplication() : Application(), Configuration.Provider {
    @Inject
    lateinit var workerFactory: WorkManagerCallFactory
    override val workManagerConfiguration: Configuration
        get() = Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .setMinimumLoggingLevel(android.util.Log.INFO)
            .build()

}


    class WorkManagerCallFactory @Inject constructor(private val api: Api) : WorkerFactory() {
        override fun createWorker(
            appContext: Context,
            workerClassName: String,
            workerParameters: WorkerParameters
        ): ListenableWorker = WorkManagerCall(api, appContext, workerParameters)
    }
    
    @HiltWorker
    class WorkManagerCall @AssistedInject constructor(
         @Assisted private val api: Api,
        @Assisted context: Context,
        @Assisted params: WorkerParameters
    ) : CoroutineWorker(context, params) {
        override suspend fun doWork(): Result {
            val userData = UserData("9901907999", 23, "", 39, 23, "")
            return try {
                api.registerUser(userData)
                Log.d("WorkTest", "Success")
                return Result.success()
            } catch (e: HttpException) {
                Log.d("WorkTest", "Failed")
                Result.retry()
            } catch (e: Exception) {
                Log.d("WorkTest", "Failed")
                Result.failure()
            }
        }
    }

问题原因及修复方案

核心问题

  1. @Assisted注解滥用:WorkManager的Hilt辅助工厂仅允许Context和WorkerParameters使用@Assisted注解,其他依赖(比如Api)应由Hilt直接注入,不能标记为@Assisted。
  2. 自定义WorkerFactory冗余:使用@HiltWorker注解时,Hilt会自动生成对应的WorkerFactory实现,无需手动编写WorkManagerCallFactory,自定义工厂类会和Hilt自动生成的逻辑冲突。

修正后的代码

1. 调整Application类,使用Hilt提供的HiltWorkerFactory

@HiltAndroidApp
class WorkManagerApplication : Application(), Configuration.Provider {
    @Inject
    lateinit var workerFactory: HiltWorkerFactory

    override val workManagerConfiguration: Configuration
        get() = Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .setMinimumLoggingLevel(android.util.Log.INFO)
            .build()
}

2. 移除自定义的WorkManagerCallFactory类

3. 修正WorkManagerCall的构造函数,仅对Context和WorkerParameters加@Assisted

@HiltWorker
class WorkManagerCall @AssistedInject constructor(
    private val api: Api, // 此处无需@Assisted,由Hilt注入
    @Assisted context: Context,
    @Assisted params: WorkerParameters
) : CoroutineWorker(context, params) {
    override suspend fun doWork(): Result {
        val userData = UserData("9901907999", 23, "", 39, 23, "")
        return try {
            api.registerUser(userData)
            Log.d("WorkTest", "Success")
            Result.success()
        } catch (e: HttpException) {
            Log.d("WorkTest", "Failed")
            Result.retry()
        } catch (e: Exception) {
            Log.d("WorkTest", "Failed")
            Result.failure()
        }
    }
}

额外说明

确保你的Api类已经被Hilt正确绑定(比如使用@Module+@Provides注解提供实例,或者Api本身是@Inject构造的类),这样Hilt才能正确注入Api到Worker中。

内容的提问来源于stack exchange,提问作者Riya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:23:26