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() } } }
问题原因及修复方案
核心问题
- @Assisted注解滥用:WorkManager的Hilt辅助工厂仅允许
Context和WorkerParameters使用@Assisted注解,其他依赖(比如Api)应由Hilt直接注入,不能标记为@Assisted。 - 自定义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
相关产品推荐
相关产品推荐

