使用IDE插件在WizardTemplateProvider模板中注入插件



我正在为MVVM创建一个模板。它将作为IDE模板工作,并帮助我获得所有的样板代码。我已经创建了ACTIVITY、ViewModel和所需的Layout文件。

  • 现在我正在为build.gradle文件
  • 添加依赖项效果良好

addDependency("com.google.gdagger: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)

这是配方执行器类,我从中获得addDependency>applyPlugin[/em>方法

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 addDynamicFeature(name: kotlin.String, toModule: java.io.File): kotlin.Unit
public abstract fun addIncludeToSettings(moduleName: kotlin.String): kotlin.Unit
public abstract fun addModuleDependency(configuration: kotlin.String, moduleName: kotlin.String, toModule: java.io.File): kotlin.Unit
public abstract fun addSourceSet(type: com.android.tools.idea.wizard.template.SourceSetType, name: kotlin.String, dir: java.io.File): kotlin.Unit
public abstract fun applyPlugin(plugin: kotlin.String): kotlin.Unit
public abstract fun copy(from: java.io.File, to: java.io.File): kotlin.Unit
public abstract fun createDirectory(at: java.io.File): kotlin.Unit
public abstract fun getClasspathDependencyVarName(mavenCoordinate: kotlin.String, valueIfNotFound: kotlin.String): kotlin.String
public abstract fun getDependencyVarName(mavenCoordinate: kotlin.String, valueIfNotFound: kotlin.String): kotlin.String
public abstract fun hasDependency(mavenCoordinate: kotlin.String, moduleDir: java.io.File? /* = compiled code */): kotlin.Boolean
public abstract fun mergeXml(source: kotlin.String, to: java.io.File): kotlin.Unit
public abstract fun open(file: java.io.File): kotlin.Unit
public abstract fun requireJavaVersion(version: kotlin.String, kotlinSupport: kotlin.Boolean /* = compiled code */): kotlin.Unit
public abstract fun save(source: kotlin.String, to: java.io.File): kotlin.Unit
public abstract fun setBuildFeature(name: kotlin.String, value: kotlin.Boolean): kotlin.Unit
public abstract fun setComposeOptions(kotlinCompilerExtensionVersion: kotlin.String?, kotlinCompilerVersion: kotlin.String?): kotlin.Unit
public abstract fun setCppOptions(cppFlags: kotlin.String, cppPath: kotlin.String, cppVersion: kotlin.String): kotlin.Unit
public abstract fun setExtVar(name: kotlin.String, value: kotlin.String): kotlin.Unit
public abstract fun setUseKotlinIrCompiler(): kotlin.Unit
public abstract fun setViewBinding(value: kotlin.Boolean): kotlin.Unit
}

这是我的LibraryActivityRecipe.kt

package other.activity
import android.databinding.tool.ext.toCamelCase
import com.android.tools.idea.npw.module.recipes.addKotlinPlugins
import com.android.tools.idea.wizard.template.Language
import com.android.tools.idea.wizard.template.ModuleTemplateData
import com.android.tools.idea.wizard.template.RecipeExecutor
import com.android.tools.idea.wizard.template.escapeKotlinIdentifier
import com.android.tools.idea.wizard.template.impl.other.automotiveMediaService.buildGradle
import kotlinx.coroutines.flow.merge
import other.utlis.*
import java.io.File
import kotlin.script.experimental.api.merge

fun RecipeExecutor.LibraryActivityRecipe(
moduleData: ModuleTemplateData,
className: String,
layoutName: String,
title: String,
packageName: String,
isViewMode: Boolean,
isResourcePrefix: Boolean,
headerString: String,
resourcePrefixName: String
) {
val (projectData, srcOut, resOut, manifestOut) = moduleData
val appCompatVersion = moduleData.apis.appCompatVersion

val ktOrJavaExt = projectData.language.extension
var applicationPackage = projectData.applicationPackage//包名
if (applicationPackage.isNullOrEmpty()) {
applicationPackage = escapeKotlinIdentifier(packageName)
}


var resourcePrefixClass = getResPrefixClass(applicationPackage, resourcePrefixName, isResourcePrefix)


var resourcePrefixXml = getResPrefixXml(applicationPackage, resourcePrefixName, isResourcePrefix)


val pkFile = getApplicationPackageFile(srcOut, applicationPackage)

val typeName = "Activity"

val lastClassName = getFormatName(resourcePrefixClass + className)

val lastClassNameFormat = getFormatName(lastClassName, typeName)

val lastLayoutName = resourcePrefixXml + layoutName

val lastItemName = lastLayoutName + "_item"

val lastTitleName = resourcePrefixXml + "string_" + className.toLowerCase() + "_title"

save(

getStrClass(
isViewMode,
applicationPackage,
packageName,
lastClassName,
typeName,
lastLayoutName.toCamelCase(),
headerString
),
srcOut.resolve("$lastClassNameFormat.$ktOrJavaExt")
)
save(
getStrXml(isViewMode, applicationPackage, packageName, lastClassNameFormat, lastItemName),
resOut.resolve("layout/${lastLayoutName}.xml")
)

if (!title.isNullOrEmpty()) {

mergeXml(getStrString(lastTitleName, title), resOut.resolve("values/strings.xml"))
}

if (isViewMode) {

val viewModelName = getFormatName(lastClassName, "ViewModel") //MainActivityViewModel
save(
getStrViewModule(applicationPackage, lastClassName, headerString),
pkFile.resolve("viewmodel/$viewModelName.$ktOrJavaExt")
)

save(
getStrXmlItem(applicationPackage, lastClassName),
resOut.resolve("layout/$lastItemName.xml")
)
}

mergeXml(
getStrAndroidManifestXml("${packageName}.${lastClassNameFormat}"),
manifestOut.resolve("AndroidManifest.xml")
)
applyPlugin("kotlin-kapt")
addDependency("com.android.support:support-media-compat:${appCompatVersion}.+")
addDependency("com.google.dagger:hilt-android:2.44")


open(srcOut.resolve("${lastClassNameFormat}.${ktOrJavaExt}"))
}

我对你的问题有两个不同的相反答案。

  1. 请求已提交到Google Issue Tracker网站https://issuetracker.google.com/issues/213757358。这意味着没有任何方法来实现它

  2. 但我看到了一个Hilt集成的样本,但我还没有测试它。所以你自己测试一下。

自定义活动.kt

fun RecipeExecutor. customActivityRecipe(
moduleData: ModuleTemplateData,
activityClass: String,
isLauncher: Boolean,
addHilt: Boolean,
generateLayout: Boolean,
layoutName: String,
packageName: String
) {
val (projectData, srcOut, resOut, manifestOut) = moduleData
val ktOrJavaExt = projectData.language.extension
val appCompatVersion = moduleData.apis.appCompatVersion
val useAndroidX = projectData.androidXSupport
addAllKotlinDependencies(moduleData) // to gradle
mergeXml(
source = androidManifestXml(activityClass, moduleData.isLibrary, isLauncher, packageName),
to = manifestOut.resolve("AndroidManifest.xml")
) // to gradle
if (generateLayout) {
generateSimpleLayout(moduleData, activityClass, layoutName)
}
addDependency("com.android.support:appcompat-v7:$appCompatVersion.+")
if (addHilt) {
applyPlugin("dagger.hilt.android.plugin")
applyPlugin("kotlin-kapt")
addClasspathDependency("com.google.dagger:hilt-android-gradle-plugin:2.28-alpha")
addDependency("com.google.dagger:hilt-android:2.28-alpha")
addDependency("com.google.dagger:hilt-android-compiler:2.28-alpha", "kapt")
}
val customActivity = when (projectData.language) {
Language.Java -> customActivityJava(
activityClass,
generateLayout,
layoutName,
packageName,
useAndroidX
)
Language.Kotlin -> customActivityKt(
activityClass,
generateLayout,
layoutName,
packageName,
useAndroidX
)
}
save(source = customActivity, to = srcOut.resolve("$activityClass.$ktOrJavaExt"))
open(srcOut.resolve("$activityClass.$ktOrJavaExt"))
}

参考上述代码MVI代码模板

最新更新