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

无法将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中的正确配置。

修复步骤

  1. 删除自定义的WorkManagerInitializer模块
    无需自行实现Initializer,Application实现Configuration.Provider后,Hilt会自动处理WorkManager的初始化,并使用你注入的HiltWorkerFactory。

  2. 保留Application中的配置
    你的PdmDerma类中的getWorkManagerConfiguration已经正确设置了WorkerFactory,无需修改。

  3. 清理编译缓存
    删除项目的build文件夹,执行Clean Project和Rebuild Project,确保Hilt生成的代码正确更新。

完成以上操作后,WorkManager会通过HiltWorkerFactory创建DermaWorker,从而正确注入DermaDao,解决异常问题。

内容的提问来源于stack exchange,提问作者Ibrahim khalil Shakir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:30:51