Flutter富文本编辑器插件super_editor的使用

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

Flutter富文本编辑器插件super_editor的使用

简介

Super Editor

Super Editor 是一个开源、可配置和可扩展的Flutter文本编辑器和文档渲染器。它支持多种后端集成,您可以根据需要插入自己的后端服务。

更新说明 (2024年6月)

我们正在积极改进核心编辑器功能,如撤销/重做、稳定的编辑器管道和有用的编辑器反应。这些API已经发生了很大变化,因此我们有一段时间没有发布标准版本。不过,Super Editor及其相关项目仍在定期开发中。我们现在开始发布开发者版本,以便社区可以了解我们的工作进展。

支持平台

  • 支持的平台

    • Mac OS
    • Web
    • Android
    • iOS
  • 未验证的平台

    • Windows
    • Linux

运行示例实现

Super Editor 包含一个示例应用程序,用于展示核心功能和交互UI元素。您可以通过以下命令运行示例应用程序:

cd example
flutter run -d macos

显示编辑器

基本用法

要显示一个默认的富文本编辑器,可以使用 SuperEditor 小部件:

class _MyAppState extends State<MyApp> {
  late final MutableDocument _document;
  late final MutableComposer _composer;
  late final Editor _editor;

  @override
  void initState() {
    super.initState();

    // 创建初始文档内容
    _document = MutableDocument(
      nodes: [
        ParagraphNode(
          id: DocumentEditor.createNodeId(),
          text: AttributedText('This is a header'),
          metadata: {
            'blockType': header1Attribution,
          },
        ),
        ParagraphNode(
          id: DocumentEditor.createNodeId(),
          text: AttributedText('This is the first paragraph'),
        ),
      ],
    );

    // 创建用户选择器
    _composer = MutableDocumentComposer();
    
    // 创建编辑器
    _editor = createDefaultDocumentEditor(document: _document, composer: _composer);
  }

  @override
  Widget build(BuildContext context) {
    return SuperEditor(
      document: _document,
      composer: _composer,
      editor: _editor,
    );
  }
}

自定义样式和组件

您可以自定义 SuperEditor 的样式和组件:

class _MyAppState extends State<MyApp> {
  late final MutableDocument _document;
  late final MutableComposer _composer;
  late final Editor _editor;

  @override
  void initState() {
    super.initState();

    _document = MutableDocument(
      nodes: [
        ParagraphNode(
          id: DocumentEditor.createNodeId(),
          text: AttributedText('Custom Task Node Example'),
        ),
      ],
    );

    _composer = MutableDocumentComposer();
    _editor = createDefaultDocumentEditor(document: _document, composer: _composer);
  }

  @override
  Widget build(BuildContext context) {
    return SuperEditor(
      editor: _editor,
      selectionStyle: null,
      stylesheet: defaultStylesheet.copyWith(
        addRulesAfter: [
          StyleRule(
            const BlockSelector("task"),
            (document, node) {
              if (node is! TaskNode) {
                return {};
              }

              return {
                Styles.padding: const CascadingPadding.only(top: 24),
              };
            },
          )
        ],
      ),
      componentBuilders: [
        ...defaultComponentBuilders,
        // 添加自定义组件构建器
      ],
    );
  }
}

示例代码

以下是完整的示例代码,展示了如何创建和运行一个基本的富文本编辑器:

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

void main() async {
  runApp(SuperEditorDemoApp());
}

class SuperEditorDemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Super Editor Demo App',
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: HomeScreen(),
      supportedLocales: const [
        Locale('en', ''),
        Locale('es', ''),
      ],
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      debugShowCheckedModeBanner: false,
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  late final MutableDocument _document;
  late final MutableComposer _composer;
  late final Editor _editor;

  @override
  void initState() {
    super.initState();

    _document = MutableDocument(
      nodes: [
        ParagraphNode(
          id: DocumentEditor.createNodeId(),
          text: AttributedText('This is a header'),
          metadata: {
            'blockType': header1Attribution,
          },
        ),
        ParagraphNode(
          id: DocumentEditor.createNodeId(),
          text: AttributedText('This is the first paragraph'),
        ),
      ],
    );

    _composer = MutableDocumentComposer();
    _editor = createDefaultDocumentEditor(document: _document, composer: _composer);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Super Editor Demo'),
      ),
      body: Center(
        child: SuperEditor(
          document: _document,
          composer: _composer,
          editor: _editor,
        ),
      ),
    );
  }
}

通过以上代码,您可以快速上手并创建一个简单的富文本编辑器应用。如果您需要更复杂的定制化功能,可以参考官方提供的更多示例和文档。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用super_editor插件来实现富文本编辑功能的代码示例。这个示例将展示如何集成super_editor、创建一个基本的富文本编辑器界面,并处理一些基本的文本编辑操作。

首先,确保你已经在pubspec.yaml文件中添加了super_editor及其依赖项:

dependencies:
  flutter:
    sdk: flutter
  super_editor: ^0.6.0  # 请检查最新版本号

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

接下来,创建一个Flutter应用,并在其中使用super_editor。以下是一个简单的示例代码:

import 'package:flutter/material.dart';
import 'package:super_editor/super_editor.dart';
import 'package:super_editor/src/infrastructure/_enums.dart';

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late AttributedTextController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化AttributedTextController
    _controller = AttributedTextController(
      text: AttributedText(
        text: 'Hello, Super Editor!',
        styles: [
          TextStyleAttribute(
            style: TextStyle(fontSize: 24, color: Colors.black),
            range: TextRange(start: 0, end: 17),
          ),
        ],
      ),
    );
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Super Editor Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // 富文本编辑器
            Expanded(
              child: SuperRichText(
                controller: _controller,
                focusNode: FocusNode(),
                toolbarOptions: const [
                  ToolbarOptions(
                    toolbarButtons: [
                      ToolbarButton(
                        icon: Icons.bold,
                        action: (controller, range) {
                          controller.addAttribute(TextStyleAttribute(
                            style: TextStyle(fontWeight: FontWeight.bold),
                            range: range,
                          ));
                        },
                      ),
                      ToolbarButton(
                        icon: Icons.italic,
                        action: (controller, range) {
                          controller.addAttribute(TextStyleAttribute(
                            style: TextStyle(fontStyle: FontStyle.italic),
                            range: range,
                          ));
                        },
                      ),
                      // 可以添加更多工具按钮
                    ],
                  ),
                ],
              ),
            ),
            // 显示当前文本内容(用于调试)
            SizedBox(height: 16),
            Text(
              _controller.text.plainText,
              style: TextStyle(fontSize: 16, color: Colors.grey),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化AttributedTextController:这是super_editor的核心控制器,用于管理富文本的内容和样式。
  2. 创建SuperRichText组件:这是显示和编辑富文本的组件。我们为其提供了一个controller和基本的toolbarOptions,其中包含了加粗和斜体按钮。
  3. 处理文本样式:在工具栏按钮的action回调中,我们使用controller.addAttribute方法为选定的文本范围添加样式。

这个示例展示了如何使用super_editor来创建一个基本的富文本编辑器。你可以根据需要扩展工具栏选项,添加更多文本样式和功能。

回到顶部