Flutter Markdown编辑器插件simple_markdown_editor_plus的使用

Flutter Markdown编辑器插件simple_markdown_editor_plus的使用

简介

simple_markdown_editor_plus 是一个用于 Flutter 的简单 Markdown 编辑器库。它是对 zahniar88/simple_markdown_editor 的扩展版本。该插件支持多种功能,如加粗、斜体、删除线、代码块、引用、链接等。

特性

  • ✅ 将文本转换为加粗、斜体、删除线。
  • ✅ 将文本转换为代码、引用、链接。
  • ✅ 将文本转换为标题(H1、H2、H3)。
  • ✅ 支持无序列表和复选框列表。
  • ✅ 支持多行转换。
  • ✅ 支持自动转换表情符号。

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
    simple_markdown_editor_plus: ^0.2.7

然后运行以下命令安装依赖:

flutter pub get

2. 初始化控制器和焦点节点

导入必要的库并初始化控制器和焦点节点:

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

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

3. 显示 Markdown 编辑器

带工具栏的编辑器
class HomeScreen extends StatelessWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Home Screen"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            MaterialButton(
              onPressed: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (_) => const EditorScreen()));
              },
              color: Colors.blue,
              child: const Text(
                "Editor Screen 1",
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
            ),
            const SizedBox(height: 10),
            MaterialButton(
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (_) => const EditorTestPreviewUnfocused()));
              },
              color: Colors.blue,
              child: const Text(
                "Editor Screen 2",
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
示例代码
class EditorScreen extends StatefulWidget {
  const EditorScreen({Key? key}) : super(key: key);

  @override
  _EditorScreenState createState() => _EditorScreenState();
}

class _EditorScreenState extends State<EditorScreen> {
  final TextEditingController _controller = TextEditingController();

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Markdown Editor"),
        actions: [
          IconButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (_) => SecondScreen(
                    data: _controller.text,
                  ),
                ),
              );
            },
            icon: const Icon(Icons.view_compact),
          ),
        ],
      ),
      body: SafeArea(
        child: Column(
          children: [
            Expanded(
              child: MarkdownFormField(
                controller: _controller,
                enableToolBar: true,
                emojiConvert: true,
                autoCloseAfterSelectEmoji: false,
              ),
            ),
          ],
        ),
      ),
    );
  }
}
不带工具栏的编辑器
class EditorTestPreviewUnfocused extends StatefulWidget {
  const EditorTestPreviewUnfocused({Key? key}) : super(key: key);

  @override
  _EditorTestPreviewUnfocusedState createState() =>
      _EditorTestPreviewUnfocusedState();
}

class _EditorTestPreviewUnfocusedState
    extends State<EditorTestPreviewUnfocused> {
  final TextEditingController _controller = TextEditingController();

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Markdown Editor"),
      ),
      body: SafeArea(
        child: Column(
          children: [
            Container(
              height: 300,
              decoration: BoxDecoration(
                border: Border.all(color: Colors.black),
                borderRadius: BorderRadius.circular(20),
              ),
              child: MarkdownFormField(
                controller: _controller,
                enableToolBar: true,
                emojiConvert: true,
                autoCloseAfterSelectEmoji: false,
              ),
            ),
            const SizedBox(height: 10),
            TextFormField(),
          ],
        ),
      ),
    );
  }
}

4. 解析 Markdown 文本

如果需要将 Markdown 文本解析为富文本,可以使用 MarkdownParse 组件:

class SecondScreen extends StatelessWidget {
  const SecondScreen({Key? key, required this.data}) : super(key: key);

  final String data;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Markdown Parse"),
      ),
      body: MarkdownParse(
        data: data,
        onTapHastag: (String name, String match) {
          // 处理标签点击事件
          print('Tag Name: $name, Match: $match');
        },
        onTapMention: (String name, String match) {
          // 处理提及点击事件
          print('Mention Name: $name, Match: $match');
        },
      ),
    );
  }
}

5. 自定义工具栏样式

可以通过设置 toolbarBackgroundexpandableBackground 来自定义工具栏的样式:

MarkdownFormField(
  controller: _controller,
  enableToolBar: true,
  emojiConvert: true,
  autoCloseAfterSelectEmoji: false,
  toolbarBackground: Colors.blue,
  expandableBackground: Colors.blue[200],
)

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

1 回复

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


simple_markdown_editor_plus 是一个用于 Flutter 的 Markdown 编辑器插件,它允许用户在应用中轻松地编辑和预览 Markdown 文本。以下是使用该插件的基本步骤和示例代码。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 simple_markdown_editor_plus 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_markdown_editor_plus: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 以安装依赖。

2. 导入包

在需要使用 Markdown 编辑器的 Dart 文件中导入 simple_markdown_editor_plus 包:

import 'package:simple_markdown_editor_plus/simple_markdown_editor_plus.dart';

3. 使用 Markdown 编辑器

在 Flutter 页面中使用 SimpleMarkdownEditor 组件。以下是一个简单的示例:

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

class MarkdownEditorPage extends StatefulWidget {
  @override
  _MarkdownEditorPageState createState() => _MarkdownEditorPageState();
}

class _MarkdownEditorPageState extends State<MarkdownEditorPage> {
  String markdownText = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Markdown Editor'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            SimpleMarkdownEditor(
              controller: MarkdownEditorController(),
              onChanged: (String value) {
                setState(() {
                  markdownText = value;
                });
              },
            ),
            SizedBox(height: 20),
            Text(
              'Preview:',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 10),
            Expanded(
              child: SingleChildScrollView(
                child: MarkdownPreview(data: markdownText),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行应用并查看效果。SimpleMarkdownEditor 提供了一个文本编辑区域,用户可以输入 Markdown 文本,同时在下方的预览区域中实时查看渲染后的效果。

5. 自定义选项

simple_markdown_editor_plus 提供了多种自定义选项,例如设置编辑器的初始内容、自定义工具栏按钮等。你可以通过 MarkdownEditorControllerSimpleMarkdownEditor 的构造函数来配置这些选项。

MarkdownEditorController _controller = MarkdownEditorController(
  initialContent: '# Hello, Markdown!',
);

SimpleMarkdownEditor(
  controller: _controller,
  onChanged: (String value) {
    setState(() {
      markdownText = value;
    });
  },
  toolbarOptions: ToolbarOptions(
    bold: true,
    italic: true,
    heading: true,
    link: true,
    image: true,
    code: true,
    list: true,
    quote: true,
    horizontalRule: true,
  ),
);
回到顶部