Flutter图表与流程图绘制插件mermaid的使用
Flutter图表与流程图绘制插件mermaid的使用
Mermaid是一个JavaScript库,它使用基于Markdown的语法来渲染可自定义的图表、流程图和可视化。在Flutter Web项目中,可以通过Dart的JS互操作(interop)来使用Mermaid库。
使用步骤
1. 添加依赖
首先,在pubspec.yaml
文件中添加对mermaid
包的依赖:
dependencies:
mermaid: ^0.9.3
然后运行flutter pub get
命令来安装依赖。
2. 加载Mermaid资源
在HTML布局中加载最新的Mermaid JavaScript和CSS资源:
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<div id="html"></div>
3. 调用Mermaid方法
接下来,在Dart代码中调用Mermaid的相关方法。以下是一个完整的示例demo:
import 'dart:html';
import 'package:markdown/markdown.dart' as md;
import 'package:mermaid/mermaid.dart';
const testMarkdownWithMermaid = """
[Sequence Diagram](http://mermaid-js.github.io/mermaid/#/./sequenceDiagram)
------------------
```mermaid
sequenceDiagram
participant Alice
participant Bob
Alice->>John: Hello John, how are you?
loop Healthcheck
John->>John: Fight against hypochondria
end
Note right of John: Rational thoughts <br/>prevail!
John-->>Alice: Great!
John->>Bob: How about you?
Bob-->>John: Jolly good!
“”";
final nullSanitizer_SVGCantBeInsertedWithoutIt = NullTreeSanitizer();
void main() { // 初始化Mermaid配置 MermaidApi.initialize( Config( securityLevel: SecurityLevel.Strict, theme: Theme.Forest, logLevel: LogLevel.Error, startOnLoad: false, arrowMarkerAbsolute: true, flowchart: FlowChartConfig(htmlLabels: true), sequence: SequenceDiagramConfig(), gnatt: GnattConfig(), ) );
final htmlDiv = document.getElementById(‘html’);
// 将Markdown内容转换为HTML并插入到DOM中 htmlDiv.setInnerHtml( md.markdownToHtml(testMarkdownWithMermaid, extensionSet: md.ExtensionSet.gitHubWeb, treeSanitizer: nullSanitizer_SVGCantBeInsertedWithoutIt, ) );
// 渲染Mermaid图表 mermaidRender(htmlDiv.querySelectorAll(‘code.language-mermaid’)); }
/// 这个类允许SVG节点插入到DOM中而不被过滤掉。 class NullTreeSanitizer implements NodeTreeSanitizer { @override void sanitizeTree(Node node) {} }
### 示例解释
1. **初始化Mermaid**:通过`MermaidApi.initialize()`方法设置Mermaid的配置选项。
2. **Markdown转HTML**:使用`markdownToHtml()`方法将包含Mermaid语法的Markdown文本转换为HTML,并将其插入到指定的DOM元素中。
3. **渲染Mermaid图表**:通过`mermaidRender()`方法选择包含Mermaid源代码的元素,并进行渲染。
### 其他功能
除了上述基本用法外,Mermaid还提供了其他一些高级功能,例如直接获取SVG代码的方法。不过需要注意的是,Mermaid需要浏览器环境才能生成SVG,因此无法在服务器端生成Mermaid图表。
## 更多示例
以下是一个更复杂的示例,展示了如何通过不同的方式调用Mermaid渲染方法:
```dart
// 导入必要的包
import 'dart:html';
import 'package:markdown/markdown.dart' as md;
import 'package:mermaid/mermaid.dart';
// 定义一个空的树结构净化器,以便能够插入SVG
class NullTreeSanitizer implements NodeTreeSanitizer {
@override
void sanitizeTree(Node node) {}
}
void main() {
// 初始化Mermaid配置
MermaidApi.initialize(Config(
securityLevel: SecurityLevel.Strict,
theme: Theme.Forest,
logLevel: LogLevel.Error,
startOnLoad: false,
arrowMarkerAbsolute: true,
flowchart: FlowChartConfig(htmlLabels: true),
sequence: SequenceDiagramConfig(),
gnatt: GnattConfig(),
));
final htmlDiv = document.getElementById('html');
// 将Markdown内容转换为HTML并插入到DOM中
htmlDiv.setInnerHtml(
md.markdownToHtml(mermaidExample,
extensionSet: md.ExtensionSet.gitHubWeb,
treeSanitizer: NullTreeSanitizer(),
)
);
// 渲染Mermaid图表
mermaidRender(htmlDiv.querySelectorAll('code.language-mermaid'));
}
// 包含多个Mermaid图表类型的示例Markdown
const String mermaidExample = """
```mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
sequenceDiagram
participant Alice
participant Bob
Alice->>John: Hello John, how are you?
loop Healthcheck
John->>John: Fight against hypochondria
end
Note right of John: Rational thoughts <br/>prevail!
John-->>Alice: Great!
John->>Bob: How about you?
Bob-->>John: Jolly good!
“”";
更多关于Flutter图表与流程图绘制插件mermaid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图表与流程图绘制插件mermaid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,虽然Mermaid本身是一个用于生成图表的JavaScript库,通常与Markdown编辑器结合使用来生成流程图、甘特图、状态图等,但直接在Flutter中使用Mermaid并不是原生支持的。不过,你可以通过一些变通的方法在Flutter应用中展示Mermaid生成的图表。
一种常见的方法是通过webview_flutter
插件在Flutter中嵌入一个WebView,然后在WebView中加载一个包含Mermaid渲染结果的HTML页面。以下是一个简单的实现步骤和代码示例:
步骤 1: 添加依赖
首先,在你的pubspec.yaml
文件中添加webview_flutter
依赖:
dependencies:
flutter:
sdk: flutter
webview_flutter: ^3.0.4 # 请检查最新版本号
步骤 2: 创建一个WebView页面来展示Mermaid图表
接下来,创建一个Flutter页面,使用WebView
来加载包含Mermaid图表的HTML内容。
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MermaidWebViewPage(),
);
}
}
class MermaidWebViewPage extends StatefulWidget {
@override
_MermaidWebViewPageState createState() => _MermaidWebViewPageState();
}
class _MermaidWebViewPageState extends State<MermaidWebViewPage> {
late WebViewController _controller;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Mermaid Chart in Flutter'),
),
body: WebView(
initialUrl: Uri.dataFromString(
_createMermaidHtml(),
mimeType: 'text/html',
encoding: Encoding.getByName('utf-8')
).toString(),
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
},
),
);
}
String _createMermaidHtml() {
return """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mermaid Chart</title>
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@9.0.0/dist/mermaid.esm.min.mjs';
document.addEventListener('DOMContentLoaded', () => {
const graphDefinition = \`graph TD;
A-->B;
A-->C;
B-->D;
C-->D;\`;
const svgGraph = mermaid.render('graphDiv', graphDefinition, (svgCode) => {
return svgCode;
});
document.body.innerHTML = '<div id="graphDiv"></div>';
});
</script>
</head>
<body>
</body>
</html>
""";
}
}
解释
- 依赖添加:在
pubspec.yaml
中添加webview_flutter
依赖。 - WebView页面:创建一个包含WebView的Flutter页面,并使用
Uri.dataFromString
方法加载一个包含Mermaid渲染逻辑的HTML字符串。 - Mermaid渲染:在HTML中,使用Mermaid的JavaScript库来渲染图表。注意,这里使用了ES模块导入Mermaid,因此需要确保在HTML中正确地处理JavaScript模块。
- 图表定义:在
graphDefinition
字符串中定义你的Mermaid图表语法。
这种方法虽然有效,但可能会引入一些性能开销,因为WebView是一个重量级的组件。如果性能是关键考虑因素,你可能需要寻找或开发一个原生支持Flutter的图表库。不过,对于快速原型开发或简单的应用场景,这种方法是一个不错的选择。