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

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


简介

Flutter Html Editor - Enhanced 是一个用于 Android、iOS 和 Web 的富文本编辑器。它基于 Summernote 的 JavaScript 封装,可以帮助用户编写所见即所得(WYSIWYG)的 HTML 代码。

特点:

  • 支持 Flutter Web,几乎包含所有移动端功能。
  • 提供完全原生的 Flutter 控件。
  • 使用高度优化的 WebView 来提供最佳体验。
  • 不依赖本地服务器加载 HTML 编辑器代码,性能更佳。
  • 提供基于控制器的 API,方便调用方法。
  • 支持多种 Summernote 方法和回调。
  • 可以自定义工具栏样式和行为。

安装与配置

pubspec.yaml 中添加依赖:

dependencies:
  html_editor_enhanced_fork: ^2.5.0

Android 配置: 确保在 AndroidManifest.xml 文件中声明网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

iOS 配置: 为了允许用户从存储中选择文件,需要完成以下设置:

cd ios && pod install

对于图片、视频、音频和其他文件类型,可以分别使用 FileType.imageFileType.videoFileType.audioFileType.any


基本使用

以下是一个简单的使用示例:

import 'package:flutter/material.dart';
import 'package:html_editor_enhanced_fork/html_editor.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HtmlEditorExample(),
    );
  }
}

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

class _HtmlEditorExampleState extends State<HtmlEditorExample> {
  final HtmlEditorController _controller = HtmlEditorController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('富文本编辑器示例'),
      ),
      body: HtmlEditor(
        controller: _controller,
        htmlEditorOptions: HtmlEditorOptions(
          hint: '请输入您的文本...',
          initialText: '<p>初始文本</p>',
        ),
        otherOptions: OtherOptions(height: 400),
      ),
    );
  }
}

示例代码详解

以下是一个完整的示例代码,展示了如何使用 html_editor_enhanced_fork 插件实现富文本编辑器,并支持多种功能:

import 'package:flutter/material.dart';
import 'package:html_editor_enhanced_fork/html_editor.dart';
import 'package:file_picker/file_picker.dart';

void main() => runApp(HtmlEditorExampleApp());

class HtmlEditorExampleApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '富文本编辑器示例',
      home: HtmlEditorExample(title: '富文本编辑器'),
    );
  }
}

class HtmlEditorExample extends StatefulWidget {
  HtmlEditorExample({Key? key, required this.title}) : super(key: key);

  final String title;

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

class _HtmlEditorExampleState extends State<HtmlEditorExample> {
  final HtmlEditorController _controller = HtmlEditorController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        if (!kIsWeb) {
          _controller.clearFocus();
        }
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
          actions: [
            IconButton(
              icon: Icon(Icons.refresh),
              onPressed: () {
                if (kIsWeb) {
                  _controller.reloadWeb();
                } else {
                  _controller.editorController!.reload();
                }
              },
            ),
          ],
        ),
        body: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              HtmlEditor(
                controller: _controller,
                htmlEditorOptions: HtmlEditorOptions(
                  hint: '请输入您的文本...',
                  shouldEnsureVisible: true,
                  processInputHtml: false, // 关闭自动处理输入 HTML
                ),
                htmlToolbarOptions: HtmlToolbarOptions(
                  toolbarPosition: ToolbarPosition.aboveEditor,
                  toolbarType: ToolbarType.nativeScrollable,
                  onButtonPressed: (ButtonType type, bool? status, Function? updateStatus) {
                    print("按钮 '${describeEnum(type)}' 被按下,当前状态为 $status");
                    return true;
                  },
                  onDropdownChanged: (DropdownType type, dynamic changed, Function(dynamic)? updateSelectedItem) {
                    print("下拉框 '${describeEnum(type)}' 改变为 $changed");
                    return true;
                  },
                  mediaLinkInsertInterceptor: (String url, InsertFileType type) {
                    print('插入链接: $url');
                    return true;
                  },
                  mediaUploadInterceptor: (PlatformFile file, InsertFileType type) async {
                    print('上传文件: ${file.name}, 大小: ${file.size}, 类型: ${file.extension}');
                    return true;
                  },
                ),
                otherOptions: OtherOptions(height: 550),
                callbacks: Callbacks(
                  onBeforeCommand: (String? currentHtml) {
                    print('命令执行前 HTML: $currentHtml');
                  },
                  onChangeContent: (String? changed) {
                    print('内容更改至: $changed');
                  },
                  onInit: () {
                    print('初始化完成');
                  },
                ),
                plugins: [
                  SummernoteAtMention(
                    getSuggestionsMobile: (String value) {
                      return ['测试1', '测试2', '测试3']
                          .where((element) => element.contains(value))
                          .toList();
                    },
                    mentionsWeb: ['测试1', '测试2', '测试3'],
                    onSelect: (String value) {
                      print('选择提及: $value');
                    },
                  ),
                ],
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    ElevatedButton(
                      onPressed: () {
                        _controller.undo();
                      },
                      child: Text('撤销'),
                    ),
                    SizedBox(width: 16),
                    ElevatedButton(
                      onPressed: () {
                        _controller.clear();
                      },
                      child: Text('重置'),
                    ),
                    SizedBox(width: 16),
                    ElevatedButton(
                      onPressed: () async {
                        String text = await _controller.getText();
                        print('当前 HTML: $text');
                      },
                      child: Text('获取 HTML'),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


html_editor_enhanced_fork 是一个 Flutter 插件,用于在应用中嵌入一个功能丰富的 HTML 编辑器。它是 html_editor_enhanced 的一个分支版本,提供了更多的自定义选项和功能。以下是如何使用 html_editor_enhanced_fork 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 html_editor_enhanced_fork 依赖:

dependencies:
  flutter:
    sdk: flutter
  html_editor_enhanced_fork: ^2.0.0  # 请检查最新版本

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

2. 导入包

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

import 'package:html_editor_enhanced_fork/html_editor.dart';

3. 使用 HtmlEditor 组件

在你的 Flutter 应用中使用 HtmlEditor 组件。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:html_editor_enhanced_fork/html_editor.dart';

class HtmlEditorExample extends StatefulWidget {
  @override
  _HtmlEditorExampleState createState() => _HtmlEditorExampleState();
}

class _HtmlEditorExampleState extends State<HtmlEditorExample> {
  final HtmlEditorController controller = HtmlEditorController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HTML Editor Enhanced Fork'),
        actions: [
          IconButton(
            icon: Icon(Icons.save),
            onPressed: () async {
              String html = await controller.getText();
              print(html);
            },
          ),
        ],
      ),
      body: SingleChildScrollView(
        child: HtmlEditor(
          controller: controller,
          htmlEditorOptions: HtmlEditorOptions(
            hint: "Your text here...",
            shouldEnsureVisible: true,
          ),
          htmlToolbarOptions: HtmlToolbarOptions(
            toolbarPosition: ToolbarPosition.aboveEditor,
            defaultToolbarButtons: [
              StyleButtons(),
              FontSettingButtons(),
              FontButtons(),
              ColorButtons(),
              ListButtons(),
              ParagraphButtons(),
              InsertButtons(),
              OtherButtons(),
            ],
          ),
          otherOptions: OtherOptions(
            height: 500,
          ),
        ),
      ),
    );
  }
}

4. 自定义工具栏

html_editor_enhanced_fork 允许你自定义工具栏按钮。你可以通过 HtmlToolbarOptions 来配置工具栏的显示内容和位置。

5. 获取和设置 HTML 内容

你可以使用 controller.getText() 来获取编辑器中的 HTML 内容,使用 controller.setText() 来设置编辑器中的 HTML 内容。

String html = await controller.getText();
controller.setText("<p>Hello, World!</p>");

6. 处理回调

你可以通过 HtmlEditorController 来处理各种回调,例如当用户输入内容时、当编辑器初始化完成时等。

controller.onTextChanged.listen((String text) {
  print("Text changed: $text");
});
回到顶部