Flutter图表与流程图绘制插件mermaid的使用

发布于 1周前 作者 eggper 来自 Flutter

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

1 回复

更多关于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>
    """;
  }
}

解释

  1. 依赖添加:在pubspec.yaml中添加webview_flutter依赖。
  2. WebView页面:创建一个包含WebView的Flutter页面,并使用Uri.dataFromString方法加载一个包含Mermaid渲染逻辑的HTML字符串。
  3. Mermaid渲染:在HTML中,使用Mermaid的JavaScript库来渲染图表。注意,这里使用了ES模块导入Mermaid,因此需要确保在HTML中正确地处理JavaScript模块。
  4. 图表定义:在graphDefinition字符串中定义你的Mermaid图表语法。

这种方法虽然有效,但可能会引入一些性能开销,因为WebView是一个重量级的组件。如果性能是关键考虑因素,你可能需要寻找或开发一个原生支持Flutter的图表库。不过,对于快速原型开发或简单的应用场景,这种方法是一个不错的选择。

回到顶部