无法将Dao依赖传入Android WorkManager构造函数,抛出NoSuchMethodException
在使用WorkManager时,尝试将DermaDao传入Worker构造函数,完成相关实现后无法访问Dao,抛出异常:
java.lang.NoSuchMethodException: com.itmedicus.pdmderma.worker.DermaWorker. [class android.content.Context, class androidx.work.WorkerParameters]
相关代码如下:
Worker类
@HiltWorker class DermaWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted params: WorkerParameters, private val dermaDao: DermaDao ): CoroutineWorker ( appContext,params) { override suspend fun doWork(): Result = withContext(Dispatchers.IO) { try { DamiData.addDermaList() val list = DamiData.dermaList for (derma in list) { dermaDao.insertDermaContent(derma) } Result.success() } catch (ex: Exception) { Result.failure() } } }
Application类
@HiltAndroidApp class PdmDerma : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory companion object { lateinit var appContext: Context } override fun onCreate() { super.onCreate() appContext = applicationContext plant(Timber.DebugTree()) } override fun getWorkManagerConfiguration(): Configuration { return Configuration.Builder().setWorkerFactory(workerFactory) .setMinimumLoggingLevel(android.util.Log.DEBUG) .build() } }
Manifest配置
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove" /> </provider>
HiltWorkerModule
@Module @InstallIn(SingletonComponent::class) object WorkManagerInitializer : Initializer<WorkManager> { @Provides @Singleton override fun create(@ApplicationContext context: Context): WorkManager { val configuration = Configuration.Builder().build() WorkManager.initialize(context, configuration) return WorkManager.getInstance(context) } override fun dependencies(): List<Class<out Initializer<*>>> { // No dependencies on other libraries. return emptyList() } }
Build.gradle依赖
//Dagger Hilt implementation 'com.google.dagger:hilt-android:2.42' kapt 'com.google.dagger:hilt-compiler:2.42' kapt 'androidx.hilt:hilt-compiler:1.0.0' implementation 'androidx.hilt:hilt-work:1.0.0' implementation "androidx.startup:startup-runtime:1.1.1" // work manager implementation "androidx.work:work-runtime-ktx:2.7.1"
异常核心原因是WorkManager未使用Hilt提供的WorkerFactory,导致它尝试调用Worker的默认构造函数(仅接收Context+WorkerParameters),但你的DermaWorker只有@AssistedInject构造函数,因此抛出找不到方法的异常。
问题根源
你在Application中已经正确实现了Configuration.Provider并注入了HiltWorkerFactory,但自定义的WorkManagerInitializer模块又重新初始化了一个不带HiltWorkerFactory的WorkManager,覆盖了Application中的正确配置。
修复步骤
删除自定义的
WorkManagerInitializer模块
无需自行实现Initializer,Application实现Configuration.Provider后,Hilt会自动处理WorkManager的初始化,并使用你注入的HiltWorkerFactory。保留Application中的配置
你的PdmDerma类中的getWorkManagerConfiguration已经正确设置了WorkerFactory,无需修改。清理编译缓存
删除项目的build文件夹,执行Clean Project和Rebuild Project,确保Hilt生成的代码正确更新。
完成以上操作后,WorkManager会通过HiltWorkerFactory创建DermaWorker,从而正确注入DermaDao,解决异常问题。
内容的提问来源于stack exchange,提问作者Ibrahim khalil Shakir

