1 Commits

Author SHA1 Message Date
41ef164c2e 代码生成自动执行build_runner命令
右键菜单添加 build_runner 的 build watch快捷菜单
2022-06-29 17:18:27 +08:00
10 changed files with 204 additions and 54 deletions

View File

@@ -1 +1,12 @@
# FlutterJson2DartModel
自动生成`json_serializable`需要的代码,并自动运行flutter pub run build_runner build —delete-conflicting-outputs命令
## 安装
## 使用
选择需要创建Dart实体类的文件夹右键菜单选择`Dart Model Class From Json`

View File

@@ -1,10 +1,12 @@
fun properties(key: String) = project.findProperty(key).toString()
plugins {
id("org.jetbrains.intellij") version "1.1"
java
}
group = "club.ximeng.plugin.flutter"
version = "0.0.1"
group = properties("pluginGroup")
version = properties("pluginVersion")
repositories {
mavenCentral()
@@ -27,22 +29,26 @@ dependencies {
// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
version.set("2019.3.5")
pluginName.set(properties("pluginName"))
version.set(properties("platformVersion"))
plugins.set("Dart:193.7547,io.flutter:41.0.5".split(',').map(String::trim).filter(String::isNotEmpty))
// Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file.
plugins.set(properties("platformPlugins").split(',').map(String::trim).filter(String::isNotEmpty))
updateSinceUntilBuild.set(false)
}
tasks {
patchPluginXml {
changeNotes.set("""
changeNotes.set(
"""
v1.0.<br>
<em>第一次发布</em> """.trimIndent())
<em>第一次发布</em> """.trimIndent()
)
}
runPluginVerifier {
ideVersions.set("2020.3.4, 2021.1.3, 2021.2.1,2022.1.2".split(',').map(String::trim).filter(String::isNotEmpty))
ideVersions.set(properties("pluginVerifierIdeVersions").split(',').map(String::trim).filter(String::isNotEmpty))
}
}
tasks.getByName<Test>("test") {
useJUnitPlatform()
}
}

23
gradle.properties Normal file
View File

@@ -0,0 +1,23 @@
# IntelliJ Platform Artifacts Repositories
# -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html
pluginGroup=club.ximeng.plugin.flutter
pluginName=FlutterJson2DartModel
pluginVersion=1.0.1
# Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl
# See https://jb.gg/intellij-platform-builds-list for available build versions.
pluginVerifierIdeVersions=2020.3.4, 2021.1.3, 2021.2.1,2022.1.2
# https://www.jetbrains.com/intellij-repository/releases
#platformVersion=2019.3.5
#platformVersion=IU-212.5712.43
platformVersion=2021.2.4
# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
# https://plugins.jetbrains.com/plugin/13122-shell-script/versions
# https://plugins.jetbrains.com/plugin/13123-terminal/versions
# https://plugins.jetbrains.com/plugin/6351-dart/versions
# https://plugins.jetbrains.com/plugin/9212-flutter/versions
#platformPlugins=com.intellij.java,java,Dart:193.7547,io.flutter:41.0.5,com.jetbrains.sh:193.6494.42,org.jetbrains.plugins.terminal:193.5233.63
platformPlugins=com.intellij.java,java,Dart:212.5741,io.flutter:68.1.2,com.jetbrains.sh:212.5457.16,org.jetbrains.plugins.terminal:212.5284.17

View File

@@ -0,0 +1,18 @@
package club.ximeng.plugin.flutter.model.action;
import club.ximeng.plugin.flutter.model.util.CommandUtil;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
/**
* @author liu xm
* @date 2022-06-29 15:07
*/
public class RunCommandBuild extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
String command = "flutter pub run build_runner build";
CommandUtil.runFlutterPubRun(e.getProject(), command);
}
}

View File

@@ -0,0 +1,18 @@
package club.ximeng.plugin.flutter.model.action;
import club.ximeng.plugin.flutter.model.util.CommandUtil;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
/**
* @author liu xm
* @date 2022-06-29 15:46
*/
public class RunCommandWatch extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
String command = "flutter pub run build_runner watch";
CommandUtil.runFlutterPubRun(e.getProject(), command);
}
}

View File

@@ -10,7 +10,6 @@ import com.intellij.ui.TitledSeparator;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.components.BorderLayoutPanel;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -32,7 +31,6 @@ public class JsonModelConfigurable implements Configurable {
*
* @return the visible name of the configurable component
*/
@Nls(capitalization = Nls.Capitalization.Title)
@Override
public String getDisplayName() {
return PluginBundle.message("settingsPageName");

View File

@@ -4,6 +4,7 @@ import club.ximeng.plugin.flutter.model.PluginBundle;
import club.ximeng.plugin.flutter.model.handle.ModelGeneratorHandle;
import club.ximeng.plugin.flutter.model.model.ModelInfo;
import club.ximeng.plugin.flutter.model.util.ClipboardUtil;
import club.ximeng.plugin.flutter.model.util.CommandUtil;
import club.ximeng.plugin.flutter.model.util.JacksonUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
@@ -99,7 +100,11 @@ public class JsonInputDialog extends JDialog {
Messages.showErrorDialog("Class 名称不能为空", "提示");
return;
}
if (StrUtil.isBlank(jsonText)) {
if (!className.matches("^[a-zA-Z]*")) {
Messages.showErrorDialog("请输入正确的 Class 名称", "提示");
return;
}
if (StrUtil.isBlank(jsonText) || !JacksonUtil.isValidJson(jsonText)) {
Messages.showErrorDialog("请输入正确的JSON", "提示");
return;
}
@@ -113,6 +118,8 @@ public class JsonInputDialog extends JDialog {
String modelClass = modelGeneratorHandle.generateDartModelClass();
createDartFile(modelClass, modelInfo.getFileName());
sendNotification("Dart model class 文件生成成功");
// 执行命令
CommandUtil.runFlutterPubRun(project);
// 在此处添加您的代码
dispose();
}

View File

@@ -0,0 +1,57 @@
package club.ximeng.plugin.flutter.model.util;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.content.Content;
import org.jetbrains.plugins.terminal.ShellTerminalWidget;
import org.jetbrains.plugins.terminal.TerminalToolWindowFactory;
import org.jetbrains.plugins.terminal.TerminalView;
import java.io.IOException;
/**
* @author liu xm
* @date 2022-06-29 14:03
*/
public class CommandUtil {
static String command = "flutter pub run build_runner build --delete-conflicting-outputs";
public static void runFlutterPubRun(Project project) {
runFlutterPubRun(project, command);
}
public static void runFlutterPubRun(Project project, String command) {
String terminalName = "DartModelClassFromJson";
String workingDirectory = project.getBasePath();
TerminalView terminalView = TerminalView.getInstance(project);
ToolWindow window = ToolWindowManager.getInstance(project)
.getToolWindow(TerminalToolWindowFactory.TOOL_WINDOW_ID);
if (window == null) {
Messages.showErrorDialog("请检查是否已安装以下两个插件: Terminal 和 Shell Script", "提示");
return;
}
try {
Content content = window.getContentManager().findContent(terminalName);
if (content != null) {
// 2019.3
// terminalView.detachWidgetAndRemoveContent(content);
// 2020.3
terminalView.closeTab(content);
}
} catch (Exception ignored) {
}
try {
// 2019.3
// ShellTerminalWidget terminalWidget = terminalView.createLocalShellWidget(workingDirectory);
// 2020.3
ShellTerminalWidget terminalWidget = terminalView.createLocalShellWidget(workingDirectory, terminalName);
terminalWidget.executeCommand(command);
} catch (IOException exception) {
Messages.showErrorDialog("Cannot run command:" + command + " " + exception.getMessage(), "提示");
}
}
}

View File

@@ -1,10 +1,8 @@
package club.ximeng.plugin.flutter.model.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Objects;
/**
@@ -17,7 +15,7 @@ public class JacksonUtil {
public static <T> T json2Object(String jsonStr, TypeReference<T> valueTypeRef) {
try {
return MAPPER.readValue(jsonStr, valueTypeRef);
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
return null;
}
@@ -26,7 +24,7 @@ public class JacksonUtil {
public static <T> T json2Object(String jsonStr, Class<T> objClass) {
try {
return MAPPER.readValue(jsonStr, objClass);
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
return null;
}
@@ -36,7 +34,7 @@ public class JacksonUtil {
Object object = json2Object(jsonStr, Object.class);
try {
return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(object);
} catch (JsonProcessingException e) {
} catch (Exception e) {
e.printStackTrace();
}
return null;
@@ -55,7 +53,7 @@ public class JacksonUtil {
try {
MAPPER.readTree(json);
return true;
} catch (IOException exception) {
} catch (Exception exception) {
return false;
}
}

View File

@@ -1,10 +1,10 @@
<idea-plugin>
<idea-version since-build="193"/>
<id>club.ximeng.plugin.model.flutter-json-to-model</id>
<name>FlutterJson2DartModel</name>
<vendor email="960132232@qq.com" url="https://github.com/lxm-flutter/xxx">liu</vendor>
<idea-version since-build="212"/>
<id>club.ximeng.plugin.model.flutter-json-to-model</id>
<name>FlutterJson2DartModel</name>
<vendor email="960132232@qq.com" url="https://github.com/lxm-flutter/xxx">liu</vendor>
<description><![CDATA[
<description><![CDATA[
<br>提供 json 转 dart bean</br>
<br>
<h1>How To Use</h1>
@@ -18,43 +18,57 @@
<br>
]]></description>
<change-notes>
<![CDATA[
<change-notes>
<![CDATA[
<h2>1.0.1</h2>
- 新增代码生成后自动运行flutter pub run build_runner build —delete-conflicting-outputs命令
- 右键菜单添加 build_runner 的 build watch快捷菜单
<br/>
<h2>1.0.0</h2>
- Initial release
]]>
</change-notes>
</change-notes>
<depends>io.flutter</depends>
<depends>io.flutter</depends>
<!-- please see https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html
on how to target different products -->
<depends>com.intellij.modules.platform</depends>
<!-- please see https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html
on how to target different products -->
<depends>com.intellij.modules.platform</depends>
<depends>com.intellij.java</depends>
<depends>com.jetbrains.sh</depends>
<depends>org.jetbrains.plugins.terminal</depends>
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<applicationService
serviceInterface="club.ximeng.plugin.flutter.model.service.PropertiesService"
serviceImplementation="club.ximeng.plugin.flutter.model.service.PropertiesServiceImpl"/>
<applicationConfigurable
instance="club.ximeng.plugin.flutter.model.setting.JsonModelConfigurable"/>
</extensions>
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<applicationService
serviceInterface="club.ximeng.plugin.flutter.model.service.PropertiesService"
serviceImplementation="club.ximeng.plugin.flutter.model.service.PropertiesServiceImpl"/>
<applicationConfigurable
instance="club.ximeng.plugin.flutter.model.setting.JsonModelConfigurable"/>
</extensions>
<actions>
<!-- Add your actions here -->
<!-- <action id="FlutterBeanFactory.ID" class="club.ximeng.idea.plugin.flutter.action.dart_to_helper.FlutterBeanFactoryAction"-->
<!-- text="FlutterBeanFactory"-->
<!-- description="Dart files ending in entity generate dart bean factory for use">-->
<!-- <add-to-group group-id="BuildMenu" anchor="first"/>-->
<!-- <keyboard-shortcut keymap="$default" first-keystroke="alt j"/>-->
<!-- </action>-->
<action id="FlutterJsonToDartBeanModel.JsonToDartBeanAction"
class="club.ximeng.plugin.flutter.model.action.JsonToDartBeanAction"
text="Dart Model Class From Json"
icon="Icons.ICON"
description="Generate dart bean class File from JSON">
<add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/>
</action>
</actions>
</idea-plugin>
<actions>
<!-- Add your actions here -->
<action id="FlutterJsonToDartBeanModel.JsonToDartBeanAction"
class="club.ximeng.plugin.flutter.model.action.JsonToDartBeanAction"
text="Dart Model Class From Json"
icon="Icons.ICON"
description="Generate dart bean class File from JSON">
<add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/>
</action>
<action id="FlutterJsonToDartBeanModel.RunCommandBuild"
class="club.ximeng.plugin.flutter.model.action.RunCommandBuild"
text="Flutter Build Runner Build"
icon="Icons.ICON"
description="run &#39;flutter pub run build_runner build&#39;.">
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</action>
<action id="FlutterJsonToDartBeanModel.RunCommandWatch"
class="club.ximeng.plugin.flutter.model.action.RunCommandWatch"
text="Flutter Build Runner Watch"
icon="Icons.ICON"
description="run &#39;flutter pub run build_runner watch&#39;.">>
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</action>
</actions>
</idea-plugin>