开发MVVM IDE模板时调用applyPlugin添加Hilt插件报错求助
问题:Android IDE模板开发中添加Hilt插件报错的解决方法
问题背景
我正在开发一款MVVM架构的IDE模板,用于生成各类样板代码,目前已实现Activity、ViewModel及所需布局文件的生成。现在尝试向build.gradle文件中添加插件和依赖:
- 添加依赖操作正常执行:
addDependency("com.google.dagger:hilt-android:2.44")
但调用以下代码添加插件时出现错误:
applyPlugin("dagger.hilt.android.plugin")
报错信息
java.lang.NoSuchMethodError: 'void com.android.tools.idea.wizard.template.RecipeExecutor.applyPlugin(java.lang.String)' at other.activity.VLibraryActivityRecipeKt.VLibraryActivityRecipe(VLibraryActivityRecipe.kt:173) at other.activity.VLibraryActivityTemplateKt$VLibraryActivityTemplate$1$2.invoke(VLibraryActivityTemplate.kt:104) at other.activity.VLibraryActivityTemplateKt$VLibraryActivityTemplate$1$2.invoke(VLibraryActivityTemplate.kt) at com.android.tools.idea.npw.model.NewTemplateRendererKt$doRender$1.run(NewTemplateRenderer.kt:98) at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$1(WriteCommandAction.java:150) at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:947) at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$2(WriteCommandAction.java:148) at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:219) at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:184) at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.doRunWriteCommandAction(WriteCommandAction.java:157) at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$run$0(WriteCommandAction.java:128) at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:214) at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21) at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:196) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
相关代码片段
RecipeExecutor接口定义
package com.android.tools.idea.wizard.template public interface RecipeExecutor { public abstract fun addClasspathDependency(mavenCoordinate: kotlin.String, minRev: kotlin.String? /* = compiled code */): kotlin.Unit public abstract fun addDependency(mavenCoordinate: kotlin.String, configuration: kotlin.String /* = compiled code */, minRev: kotlin.String? /* = compiled code */, moduleDir: java.io.File? /* = compiled code */, toBase: kotlin.Boolean /* = compiled code */): kotlin.Unit // 省略其他方法... public abstract fun applyPlugin(plugin: kotlin.String): kotlin.Unit // 省略其他方法... }
LibraryActivityRecipe.kt核心代码
// ...(省略其他代码) applyPlugin("kotlin-kapt") addDependency("com.android.support:support-media-compat:${appCompatVersion}.+") addDependency("com.google.dagger:hilt-android:2.44") // ...(省略其他代码)
解决方法
1. 核心原因
报错的本质是:你在接口中定义的applyPlugin方法,当前Android Studio的模板API实现中并没有提供该方法的具体逻辑,导致运行时找不到对应实现。
2. 正确的插件添加方式
放弃直接调用applyPlugin,改为直接操作build.gradle文件,同时完整配置Hilt所需的依赖:
步骤1:添加项目级Hilt插件classpath依赖
首先需要在项目根目录的build.gradle中添加Hilt插件的classpath:
addClasspathDependency("com.google.dagger:hilt-android-gradle-plugin:2.44")
步骤2:修改模块级build.gradle添加插件
直接读取并修改模块的build.gradle文件,插入Hilt插件和kotlin-kapt的声明:
val moduleBuildGradle = moduleData.moduleDir.resolve("build.gradle") var buildContent = moduleBuildGradle.readText() // 插入Hilt插件和kotlin-kapt到plugins块中 if (!buildContent.contains("dagger.hilt.android.plugin")) { buildContent = buildContent.replace( Regex("plugins\\s*\\{([^}]+)\\}"), """plugins { $1 id 'dagger.hilt.android.plugin' id 'kotlin-kapt' }""" ) } // 保存修改后的文件 save(buildContent, moduleBuildGradle)
步骤3:添加Hilt注解处理器依赖
Hilt需要注解处理器支持,需添加对应的kapt依赖:
addDependency("com.google.dagger:hilt-android-compiler:2.44", configuration = "kapt")
3. 完整的Hilt配置代码示例
将上述步骤整合到你的Recipe中:
// ...(省略原有代码) // 1. 添加项目级Hilt插件classpath addClasspathDependency("com.google.dagger:hilt-android-gradle-plugin:2.44") // 2. 修改模块build.gradle添加插件 val moduleBuildGradle = moduleData.moduleDir.resolve("build.gradle") var buildContent = moduleBuildGradle.readText() if (!buildContent.contains("dagger.hilt.android.plugin")) { buildContent = buildContent.replace( Regex("plugins\\s*\\{([^}]+)\\}"), """plugins { $1 id 'dagger.hilt.android.plugin' id 'kotlin-kapt' }""" ) } save(buildContent, moduleBuildGradle) // 3. 添加Hilt相关依赖 addDependency("com.google.dagger:hilt-android:2.44") addDependency("com.google.dagger:hilt-android-compiler:2.44", configuration = "kapt") addDependency("com.android.support:support-media-compat:${appCompatVersion}.+") // ...(省略原有代码)
内容的提问来源于stack exchange,提问作者Muhammad Ibrahim
相关产品推荐
相关产品推荐

