手把手教你实现一个Flutter资源生成工具

一.开发环境
  • Intellij:0.4.18
  • kotlin:1.3.71
  • Idea:2020.1
  • mac:
    • 系统:10.15.3
    • 内存: 16G

前期准备环境搭建就不赘述了,参考了一下环境搭建 ,中间遇到的一些坑这里描述下

二.踩坑小记

java heap size
现象:项目创建完成sync插件Sdk报 java heap size
解决步骤:gradle.properties 添加org.gradle.jvmargs=-Xmx2048M
结果:7m32s693后同步成功

代码无联想,异常 ,ClassNotFound
现象:创建类代码无提示,gradle view 中 run runIde 一堆异常,代码跑不动提示创建的类异常,弄了好一会
解决步骤:重新创建了一个新项目一步步点下去自己好了,可能新项目原因

020-04-25 14:24:35,712 [  59735]   WARN - com.intellij.util.xmlb.Binding - no accessors for class org.jetbrains.kotlin.idea.highlighter.KotlinDefaultHighlightingSettingsProvider 
2020-04-25 14:24:36,178 [  60201]   WARN - Container.ComponentManagerImpl - Do not use constructor injection (requestorClass=com.android.tools.idea.lang.androidSql.room.RoomDependencyChecker) 

好了开始开发
背景:因为看到别人用 runner 实现了一个获取Flutter文件夹下图片资源生成R.xxx 实际指向图片Path,但是runner 每次需要跑一遍命令,我想是不能是能用IDEA插件开发实现,效果大致如下

image.png

我对插件开发也不熟,打开官网看了下发现恰好有这个Plugin Listener 我翻译也不好 打开google 搜索一看 大致能懂
这个能监听真个IDEA所有文件变动事件,创建,删除,移动,属性改变,删除,也可以不继承BulkFileListener单独继承,有兴趣的可以看看,官网还介绍了事件如何传递

public class MyVfsListener implements BulkFileListener {
    @Override
    public void after(@NotNull List<? extends VFileEvent> events) {
        // handle the events
    }
}

plugin.xml 下的配置

<applicationListeners>
  <listener class="myPlugin.MyVfsListener" topic="com.intellij.openapi.vfs.newvfs.BulkFileListener"/>
</applicationListeners>

点击右边的 Gradle View 跑runIde 也可以右键 选择debug模式,这是会启动一个的IDEA 运行在沙箱环境,我第一次跑 runIde 没有弹出新IDEA ,傻傻的等了好久,关掉重新启动就好了

image.png

测试后发现果然能获取到文件变动后的事件,网上搜了下如何创建dart文件,大致是说PSI,java文件,找了一个Flutter 的jsonToDart 插件用的是 VFturalFile就可以
rDartFile.setBinaryContent(content.getBytes());
因为是要往指定目录下创建文件

//获取src 目录
   VirtualFile srcFile = LocalFileSystem.getInstance().findFileByPath(project.getBasePath() + File.separator + "src");
      File.separator + "Images");
                //判断目录下是有assert文件夹
                //没有就创建一个
                VirtualFile resourceFileDir = srcFile.findChild(getResourcesDirPath());
                if (resourceFileDir == null) {
                    resourceFileDir = srcFile.createChildDirectory(null, getResourcesDirPath());
                }

获取文件都需要使用project对象,这里点击看了下注释

/**
 * An object representing an IntelliJ project.
 *
 * <p>To get all of its modules, use {@code ModuleManager.getInstance(project).getModules()}.
 *
 * <p>To iterate over all project source files and directories,
 * use {@code ProjectFileIndex.SERVICE.getInstance(project).iterateContent(iterator)}.
 *
 * <p>To get the list of all open projects, use {@code ProjectManager.getInstance().getOpenProjects()}.
 */
百度翻译
表示IntelliJ项目的对象。
要获取其所有模块,请使用ModuleManager.getInstance(project.get modules()。
要迭代所有项目源文件和目录,请使用ProjectFileIndex.SERVICE.getInstance(project.iterateContent(iterator)。
要获取所有打开项目的列表,请使用ProjectManager.getInstance().getOpenProjects()

没有介绍怎么获取,网上大都是通过Anction获取,这是我直接到github上通过BulkListener 关键字搜索


image.png
private static Project getProject(VFileEvent event) {
    Object requestor = event.getRequestor();
    if (requestor instanceof PsiManager) {
      PsiManager psiManager = (PsiManager) requestor;
      return psiManager.getProject();
    }
    return null;
  }

事后,我发现官网上还有另外一种方式

image.png

如何不通过AnAction获取当前打开的Project

Project[] projects = ProjectManager.getInstance().getOpenProjects();
Project activeProject = null;
for (Project project : projects) {
    Window window = WindowManager.getInstance().suggestParentWindow(project);
    if (window != null && window.isActive()) {
        activeProject = project;
    }
}

好了,剩下的就是文件夹内的文件列表获取文件名并生成r.dart
最终效果如下,和 flutter runner wach 实现了一样的效果

image.png

总结

整体还是挺简单的,主要是插件开发环境问题,第一次创建项目报错卡了好一会。通过对插件的功能的开发大致了解了插件相关知识,相信以后能做更多有趣的事情。
项目git地址FlutterRGenerate

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容