Flutter Markdown编辑器插件simple_markdown_editor的使用

Flutter Markdown编辑器插件simple_markdown_editor的使用

simple_markdown_editor

支持我 支持我 GitHub stars undo GitHub

Simple markdown editor库用于Flutter。 如需查看演示视频,请访问此链接 演示

新功能 (21/01/2022)

  • 如果编辑器失去焦点,则自动预览。这是根据问题 #2 的请求实现的。

特性

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

使用方法

pubspec.yaml 文件中添加依赖项:

dependencies:
    simple_markdown_editor: ^latest

运行以下命令安装:

flutter pub get

如何使用

导入库:

import 'package:simple_markdown_editor/simple_markdown_editor.dart';

初始化控制器和焦点节点。这些控制器和焦点节点是可选的,如果你不创建它们,编辑器会自行创建。

TextEditingController _controller = TextEditingController();
FocusNode _focusNode = FocusNode();

展示编辑器:

// 带有工具栏的可编辑文本
MarkdownFormField(
    controller: _controller,
    enableToolBar: true,
    emojiConvert: true,
    autoCloseAfterSelectEmoji: false,
)

// 不带工具栏的可编辑文本
MarkdownField(
    controller: _controller,
    emojiConvert: true,
)

如果你想将文本解析为Markdown,可以使用以下组件:

String data = '''
**bold**
*italic*

#hashtag
@mention
'''

MarkdownParse(
    data: data,
    onTapHastag: (String name, String match) {
        // name => hashtag
        // match => #hashtag
    },
    onTapMention: (String name, String match) {
        // name => mention
        // match => #mention
    },
)

完整示例代码

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

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

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

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

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

  [@override](/user/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,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// HomeScreen 编辑器
class EditorScreen extends StatefulWidget {
  const EditorScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  _EditorScreenState createState() => _EditorScreenState();
}

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

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  [@override](/user/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 SecondScreen extends StatelessWidget {
  const SecondScreen({Key? key, required this.data}) : super(key: key);

  final String data;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Markdown Parse"),
      ),
      body: MarkdownParse(
        data: data,
        onTapHastag: (String name, String match) {
          // 示例:#hashtag
          // name => hashtag
          // match => #hashtag
        },
        onTapMention: (String name, String match) {
          // 示例:@mention
          // name => mention
          // match => #mention
        },
      ),
    );
  }
}

// HomeScreen 编辑器
class EditorTestPreviewUnfocused extends StatefulWidget {
  const EditorTestPreviewUnfocused({Key? key}) : super(key: key);

  [@override](/user/override)
  _EditorTestPreviewUnfocusedState createState() => _EditorTestPreviewUnfocusedState();
}

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

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  [@override](/user/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(),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


simple_markdown_editor 是一个用于 Flutter 的 Markdown 编辑器插件,它允许用户在应用中轻松地编辑和渲染 Markdown 文本。以下是如何在 Flutter 项目中使用 simple_markdown_editor 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  simple_markdown_editor: ^<最新版本>

你可以通过 pub.dev 查找最新版本并将其替换为 ^<最新版本>

2. 导入包

在你的 Dart 文件中导入 simple_markdown_editor 包:

import 'package:simple_markdown_editor/simple_markdown_editor.dart';

3. 使用 SimpleMarkdownEditor

你可以在你的 widget 树中使用 SimpleMarkdownEditor 组件。以下是一个简单的示例:

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

class MarkdownEditorExample extends StatefulWidget {
  [@override](/user/override)
  _MarkdownEditorExampleState createState() => _MarkdownEditorExampleState();
}

class _MarkdownEditorExampleState extends State<MarkdownEditorExample> {
  String markdownText = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Markdown Editor'),
      ),
      body: Column(
        children: [
          SimpleMarkdownEditor(
            value: markdownText,
            onChanged: (value) {
              setState(() {
                markdownText = value;
              });
            },
            height: 300,
          ),
          SizedBox(height: 20),
          Text('Preview:'),
          SizedBox(height: 10),
          MarkdownPreview(data: markdownText),
        ],
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MarkdownEditorExample(),
  ));
}
回到顶部