Flutter Markdown解析插件standard_markdown的使用

Flutter Markdown解析插件standard_markdown的使用

standard_markdown 是一个支持 GFM(GitHub Flavored Markdown)和 CommonMark 标准的 Flutter 包。

如何使用

首先,确保你已经添加了 standard_markdown 包到你的 pubspec.yaml 文件中:

dependencies:
  standard_markdown: ^版本号

然后,你可以使用以下代码来初始化并使用 StandardMarkdown 组件:

import 'package:flutter/material.dart';
import 'package:standard_markdown/standard_markdown.dart';

// 初始化 Markdown 数据控制器
TextEditingController editingController = TextEditingController(text: markdown);

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      title: 'MarkdownViewer Demo',
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('MarkdownViewer Demo')),
      body: StandardMarkdown(
        oninit: (config) {
          // 在组件初始化时设置光标位置
          editingController.selection = TextSelection.fromPosition(const TextPosition(offset: 0));
        },
        mode: 0, // 0 表示即时渲染模式
        toolbar: true, // 显示工具栏
        selectable: true, // 文本可选
        data: editingController, // 控制 Markdown 数据的控制器
      ),
    );
  }
}

支持的编辑模式

  • ❌ 即时渲染模式 (ir)
  • ✅ 分屏模式 (sv)

支持的 CommonMark 语法

  • ✅ 分割线
  • ✅ 代码块(支持语法高亮)
  • ❌ HTML 块(XSS 过滤)
  • ✅ 链接
  • ✅ 引用
  • ✅ 段落
  • ✅ 列表
  • ✅ 反斜杠转义
  • ✅ 斜体
  • ✅ 粗体
  • ✅ 图像
  • ✅ 文本内容

支持的 GFM 语法

  • ✅ 表格
  • ✅ 任务列表项(未处理点击改变状态)
  • ✅ 删除线
  • ✅ 自动链接

其他功能

  • ❌ 注脚
  • ❌ 搜索
  • ✅ 格式化 Markdown
  • ❌ 目录
  • ✅ LaTeX/KaTeX
  • ❌ ECharts
  • ✅ 使用简单
  • ✅ 工具栏
  • ✅ 一个控制器控制所有
  • ✅ 在 Material 3 中可选

完整示例代码

import 'package:flutter/material.dart';
import 'package:standard_markdown/standard_markdown.dart';

const markdown = r'''
# 我是标题 _sd_

## 我是副标题 $dsda$

### 我是三级标题

#### 我是四级标题

##### 我是五级标题

###### 我是六级标题

```dart
class MarkdownHelper {
  Map<String, Widget> getTitleWidget(m.Node node) => title.getTitleWidget(node);
  Widget getPWidget(m.Element node) => p.getPWidget(node);
  Widget getPreWidget(m.Node node) => pre.getPreWidget(node);
}

斜体文字

粗体文字

我是代码

删除线

斜体、粗体和删除线

测试引用文本和 粗体

  • 无序列表
  • 一项
    • 子项 a a
    • 子项 bbbb
      • 子子项 CCCC
  1. 有序列表
  2. 一项
  3. 二项
    1. 子项 AAAA
    2. 子项 BBBB
    3. 子项 CCCC
  • [ ] 我是 复选框
  • [X] 我也是 复选框

测试分割线:


测试表格:

表头 1 表头 2
行 1 列 1 行 1 列 2
行 2 列 1 行 2 列 2

Markdown 示例

Hello Markdown!

特点

  • [X] 符合 100% CommonMark。

  • [X] 符合 100% GFM。

    // Dart 代码示例
    void main() {
      print('Hello, World!');
    }
    

多国语言测试

اختبار متعدد اللغات

다국어 테스트

多言語テスト

这是一篇讲解如何正确使用 Markdown 的排版示例,学会这个很有必要,能让你的文章有更佳清晰的排版。

引用文本:Markdown 是一种灵感来自文本的格式化语法

语法指导

普通内容

这段内容展示了在内容里面一些排版格式,比如:

  • 加粗 - **加粗**
  • 倾斜 - *倾斜*
  • ~删除线~ - ~~删除线~~
  • Code 标记 - Code 标记
  • 超级链接 - [超级链接](https://ld246.com)
  • username@gmail.com - [username@gmail.com](mailto:username@gmail.com)

表情符号 Emoji

支持大部分标准的表情符号,可使用输入法直接输入。

一些表情例子

😄 😆 😵 😭 😰 😅 😢 😤 😍 😌 👍 👎 💯 👏 🔔 🎁 ❓ 💣 ❤️ ☕️ 🌀 🙇 💋 🙏 💢

大标题 - Heading 3

你可以选择使用 H1 至 H6,使用 ##(N) 打头。建议帖子或回帖中的顶级标题使用 Heading 3,不要使用 1 或 2,因为 1 是系统站点级,2 是帖子标题级。

注意: 别忘了 # 后面需要有空格!

Heading 4

Heading 5
Heading 6

图片

图片描述是什么鬼?

普通代码块

语法高亮支持

如果在 ``` 后面跟随语言名称,可以有语法高亮的效果哦,比如:

演示 Go 代码高亮
package main

import "fmt"

funcmain() {
	fmt.Println("Hello, 世界");
}
演示 Java 高亮
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

提示: 语言名称支持下面这些: ruby, python, js, html, erb, css, coffee, bash, json, yml, xml

有序、无序、任务列表

无序列表

  • Java
    • Spring
      • IoC
      • AOP
  • Go
    • gofmt
    • Wide
  • Node.js
    • Koa
    • Express

有序列表

  1. Node.js
    1. Express
    2. Koa
    3. Sails
  2. Go
    1. gofmt
    2. Wide
  3. Java
    1. Latke
    2. IDEA

任务列表

  • [X] 发布 Sym
  • [X] 发布 Solo
  • [ ] 预约牙医

表格

如果需要展示数据什么的,可以选择使用表格。

表头 1 表头 2
单元格 1 单元格 2
单元格 3 单元格 4
单元格 5 单元格 6

段落

空行可以将内容进行分段,便于阅读。(这是第一段)

使用空行在 Markdown 排版中相当重要。(这是第二段)

链接引用

链接文本

数学公式

多行公式块:

$$ 123123\pm $$

行内公式:

公式$Em^2$是行内。

复杂使用

随机变量 $X$ $E(x)$期望 $Var(X)$方差
两点分布 $B(1,p)$ $P$ $p(1-p)$
二项分布 $B(n,p)$ $nP$ $np(1-p)$
泊松分布 $P(\lambda)$ $\lambda$ $\lambda$
均匀分布 $U[a,b]$ $(a+b)/2$ $(b-a)^2/12$
指数分布 $EP(\lambda)$ $1/\lambda$ $1/\lambda^2$
正态分布 $N(\mu,\sigma^2)$ $\mu$ $\sigma^2$

更多关于Flutter Markdown解析插件standard_markdown的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Markdown解析插件standard_markdown的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用standard_markdown插件来解析Markdown内容的示例代码。这个插件允许你将Markdown字符串渲染为Flutter的小部件。

首先,你需要在你的pubspec.yaml文件中添加standard_markdown依赖:

dependencies:
  flutter:
    sdk: flutter
  standard_markdown: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Dart文件中,你可以使用Markdown小部件来解析和显示Markdown内容。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:standard_markdown/standard_markdown.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Markdown Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MarkdownPage(),
    );
  }
}

class MarkdownPage extends StatelessWidget {
  final String markdownData = """
# Flutter Markdown Demo

This is a demo of using `standard_markdown` plugin in Flutter.

- Item 1
- Item 2
- Item 3

```dart
void main() {
  print("Hello, Flutter!");
}

Check out Flutter for more info. “”";

@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(‘Markdown Demo’), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Markdown( data: markdownData, styleSheet: MarkdownStyleSheet.fromTheme(context.theme), // 你也可以自定义样式表 // styleSheet: MarkdownStyleSheet( // h1: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), // p: TextStyle(fontSize: 16), // code: TextStyle(fontFamily: ‘monospace’), // // 添加更多自定义样式 // ), onLinkTap: (url) { // 处理链接点击事件 if (url.startsWith(‘http’)) { // 打开网页 _launchURL(url); } else { // 处理内部链接或其他逻辑 print(‘Link tapped: $url’); } }, ), ), ); }

// 打开URL的函数 _launchURL(String url) async { if (await canLaunch(url)) { await launch(url); } else { throw ‘Could not launch $url’; } } }


在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个使用`standard_markdown`插件解析和显示Markdown内容的页面。Markdown字符串包含标题、列表、代码块和一个链接。

- `Markdown`小部件用于解析和显示Markdown内容。
- `styleSheet`参数允许你自定义Markdown的样式,这里使用了从主题生成的样式表,但你也可以创建一个自定义的`MarkdownStyleSheet`。
- `onLinkTap`回调用于处理链接点击事件,这里我们简单地使用`url_launcher`包来打开HTTP链接(注意:你需要在`pubspec.yaml`中添加`url_launcher`依赖并运行`flutter pub get`)。

这个示例应该可以帮助你开始在Flutter项目中使用`standard_markdown`插件来解析和显示Markdown内容。如果你有任何进一步的问题或需要更复杂的示例,请随时提问!
回到顶部