Flutter富文本编辑与同步扩展插件flutter_quill_extensions_syncme的使用

Flutter富文本编辑与同步扩展插件flutter_quill_extensions_syncme的使用

📚 目录

📝 关于

flutter_quill 是一个富文本编辑器。它具有自定义嵌入构建器,允许你在编辑器中渲染自定义小部件。

这是一个扩展包,通过添加更多功能(如图像、视频等)来扩展其功能。

📦 安装

请遵循flutter_quill的使用说明。

在你的项目中添加flutter_quill_extensions依赖:

dependencies:
  flutter_quill_extensions: ^<最新版本>

或者直接从GitHub拉取:

dependencies:
  flutter_quill_extensions:
    git:
      url: https://github.com/singerdmx/flutter-quill.git
      ref: v<最新版本>
      path: flutter_quill_extensions

🛠 平台特定配置

该包使用以下插件:

  1. 使用gal来保存图片。确保遵循开始指南,因为它需要平台特定设置。
  2. 使用image_picker来选择图片。请参阅安装部分

加载互联网上的图片

Android
  1. 在你的AndroidManifest.xml文件中添加必要的权限。详情请参考Android指南Flutter联网指南。注意,只有调试版本默认包含互联网权限,发布版本需要显式添加。
  2. 若要限制仅加载HTTPS,请按需配置你的应用。如果需要支持HTTP,请调整你的应用设置以适应发布模式。查阅Android明文HTTP指南获取更多信息。
macOS

在你的Info.plist文件中包含一个键以启用互联网访问。详情请参考Flutter macOS联网文档

🚀 使用

一旦你完成了安装部分。 在QuillEditorQuillToolbar的配置中设置embedBuildersembedToolbar参数。

Quill工具栏

QuillToolbar.simple(
  configurations: QuillSimpleToolbarConfigurations(
    embedButtons: FlutterQuillEmbeds.toolbarButtons(),
  ),
),

Quill编辑器

Expanded(
  child: QuillEditor.basic(
    configurations: QuillEditorConfigurations(
      embedBuilders: kIsWeb ? FlutterQuillEmbeds.editorWebBuilders() : FlutterQuillEmbeds.editorBuilders(),
    ),
  ),
)

⚙️ 配置

📦 嵌入块

flutter_quill为所有用户提供了一个接口来实现嵌入块。这个包提供了图像、视频和公式嵌入块的实现。

使用嵌入块的说明见使用部分

🔍 元素属性

当前库对图像和视频的支持有限,仅支持widthheightmargin属性。

{
  "insert": {
    "image": "https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png"
  },
  "attributes": {
    "style": "width: 50px; height: 50px; margin: 10px;"
  }
}

🔧 自定义元素属性

不适用于官方Quill JS

定义flutterAlignment如下:

{
  "insert": {
    "image": "https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png"
  },
  "attributes": {
    "style": "flutterAlignment: topLeft"
  }
}

这仅适用于非Web平台。

📝 富文本粘贴功能

现在flutter_quill直接支持富文本粘贴功能,因为平台代码未捆绑到项目中。

🖼️ 图像资产

如果你想在Quill编辑器中使用图像资源,你需要确保你的资源文件夹名为assets,否则:

QuillEditor.basic(
  configurations: const QuillEditorConfigurations(
    // ...
    sharedConfigurations: QuillSharedConfigurations(
      extraConfigurations: {
        QuillSharedExtensionsConfigurations.key:
            QuillSharedExtensionsConfigurations(
          assetsPrefix: 'your-assets-folder-name', // 默认为`assets`
        ),
      },
    ),
  ),
);

此信息对于包检查是否使用AssetImage提供者是必要的。

🎯 拖放功能

目前,拖放功能不被正式支持,但你可以很容易地通过以下步骤实现:

  1. 拖放需要原生代码,你可以使用任何你喜欢的Flutter插件。如果你需要建议,我们推荐desktop_drop,它是为桌面开发的。它还支持Web和Android(iOS不支持)。
  2. 在你的pubspec.yaml中添加依赖项:
flutter pub add desktop_drop

并在代码中导入它:

import 'package:desktop_drop/desktop_drop.dart';
  1. QuillEditor的配置中,使用builder将编辑器包装在来自desktop_dropDropTarget中:
import 'package:flutter_quill_extensions/flutter_quill_extensions_syncme.dart';

QuillEditor.basic(
  configurations: QuillEditorConfigurations(
    padding: const EdgeInsets.all(16),
    builder: (context, rawEditor) {
      return DropTarget(
        onDragDone: _onDragDone,
        child: rawEditor,
      );
    },
    embedBuilders: kIsWeb
        ? FlutterQuillEmbeds.editorWebBuilders()
        : FlutterQuillEmbeds.editorBuilders(),
  ),
)
  1. 实现_onDragDone,根据你的用例不同,这只是一个简单的例子:
const List<String> imageFileExtensions = [
  '.jpeg',
  '.png',
  '.jpg',
  '.gif',
  '.webp',
  '.tif',
  '.heic'
];

OnDragDoneCallback get _onDragDone {
  return (details) {
    final scaffoldMessenger = ScaffoldMessenger.of(context);
    final file = details.files.first;
    final isSupported =
        imageFileExtensions.any((ext) => file.name.endsWith(ext));
    if (!isSupported) {
      scaffoldMessenger.showSnackBar(
        SnackBar(
          content: Text(
            'Only images are supported right now: ${file.mimeType}, ${file.name}, ${file.path}, $imageFileExtensions',
          ),
        ),
      );
      return;
    }
    // 为了获取这个扩展函数,请导入flutter_quill_extensions
    _controller.insertImageBlock(
      imageSource: file.path,
    );
    scaffoldMessenger.showSnackBar(
      const SnackBar(
        content: Text('Image is inserted.'),
      ),
    );
  };
}

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

1 回复

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


flutter_quill_extensions_syncme 是一个为 Flutter 富文本编辑器 flutter_quill 提供扩展功能的插件,主要目的是实现富文本编辑内容的同步功能。以下是如何使用 flutter_quill_extensions_syncme 插件的详细步骤:

1. 安装依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_quill: ^x.x.x  # 请使用最新版本
  flutter_quill_extensions_syncme: ^x.x.x  # 请使用最新版本

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

2. 初始化 QuillController

在使用 flutter_quill 之前,你需要初始化一个 QuillController 来控制富文本编辑器的内容。

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

class RichTextEditor extends StatefulWidget {
  @override
  _RichTextEditorState createState() => _RichTextEditorState();
}

class _RichTextEditorState extends State<RichTextEditor> {
  QuillController _controller;

  @override
  void initState() {
    super.initState();
    _controller = QuillController.basic();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Rich Text Editor'),
      ),
      body: Column(
        children: [
          QuillToolbar.basic(controller: _controller),
          Expanded(
            child: QuillEditor(
              controller: _controller,
              focusNode: FocusNode(),
              scrollController: ScrollController(),
              scrollable: true,
              padding: EdgeInsets.all(16),
              autoFocus: false,
              readOnly: false,
              placeholder: 'Enter your text here...',
            ),
          ),
        ],
      ),
    );
  }
}

3. 使用 flutter_quill_extensions_syncme 插件

flutter_quill_extensions_syncme 提供了同步功能,可以将编辑器的内容同步到远程服务器或其他客户端。以下是如何使用该插件的基本示例:

import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart';
import 'package:flutter_quill_extensions_syncme/flutter_quill_extensions_syncme.dart';

class RichTextEditor extends StatefulWidget {
  @override
  _RichTextEditorState createState() => _RichTextEditorState();
}

class _RichTextEditorState extends State<RichTextEditor> {
  QuillController _controller;
  SyncMeController _syncMeController;

  @override
  void initState() {
    super.initState();
    _controller = QuillController.basic();
    _syncMeController = SyncMeController(
      controller: _controller,
      // 配置同步服务
      syncService: SyncMeService(
        // 这里可以配置同步服务的URL或其他参数
        url: 'https://yoursyncservice.com',
      ),
    );
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Rich Text Editor'),
      ),
      body: Column(
        children: [
          QuillToolbar.basic(controller: _controller),
          Expanded(
            child: QuillEditor(
              controller: _controller,
              focusNode: FocusNode(),
              scrollController: ScrollController(),
              scrollable: true,
              padding: EdgeInsets.all(16),
              autoFocus: false,
              readOnly: false,
              placeholder: 'Enter your text here...',
            ),
          ),
        ],
      ),
    );
  }
}

4. 配置同步服务

SyncMeServiceflutter_quill_extensions_syncme 提供的同步服务类,你需要根据实际需求配置同步服务的URL或其他参数。例如:

SyncMeService(
  url: 'https://yoursyncservice.com',
  // 其他配置参数
);

5. 处理同步事件

SyncMeController 提供了同步事件的处理方法,你可以监听同步事件并根据需要进行处理。例如:

_syncMeController.onSyncError.listen((error) {
  // 处理同步错误
});

_syncMeController.onSyncSuccess.listen(() {
  // 处理同步成功
});

6. 启动和停止同步

你可以通过 startSyncstopSync 方法来启动和停止同步:

_syncMeController.startSync();
_syncMeController.stopSync();
回到顶部