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
🛠 平台特定配置
该包使用以下插件:
加载互联网上的图片
Android
- 在你的
AndroidManifest.xml
文件中添加必要的权限。详情请参考Android指南或Flutter联网指南。注意,只有调试版本默认包含互联网权限,发布版本需要显式添加。 - 若要限制仅加载HTTPS,请按需配置你的应用。如果需要支持HTTP,请调整你的应用设置以适应发布模式。查阅Android明文HTTP指南获取更多信息。
macOS
在你的Info.plist
文件中包含一个键以启用互联网访问。详情请参考Flutter macOS联网文档。
🚀 使用
一旦你完成了安装部分。
在QuillEditor
和QuillToolbar
的配置中设置embedBuilders
和embedToolbar
参数。
Quill工具栏
QuillToolbar.simple(
configurations: QuillSimpleToolbarConfigurations(
embedButtons: FlutterQuillEmbeds.toolbarButtons(),
),
),
Quill编辑器
Expanded(
child: QuillEditor.basic(
configurations: QuillEditorConfigurations(
embedBuilders: kIsWeb ? FlutterQuillEmbeds.editorWebBuilders() : FlutterQuillEmbeds.editorBuilders(),
),
),
)
⚙️ 配置
📦 嵌入块
flutter_quill
为所有用户提供了一个接口来实现嵌入块。这个包提供了图像、视频和公式嵌入块的实现。
使用嵌入块的说明见使用部分。
🔍 元素属性
当前库对图像和视频的支持有限,仅支持width
、height
、margin
属性。
{
"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
提供者是必要的。
🎯 拖放功能
目前,拖放功能不被正式支持,但你可以很容易地通过以下步骤实现:
- 拖放需要原生代码,你可以使用任何你喜欢的Flutter插件。如果你需要建议,我们推荐desktop_drop,它是为桌面开发的。它还支持Web和Android(iOS不支持)。
- 在你的
pubspec.yaml
中添加依赖项:
flutter pub add desktop_drop
并在代码中导入它:
import 'package:desktop_drop/desktop_drop.dart';
- 在
QuillEditor
的配置中,使用builder
将编辑器包装在来自desktop_drop
的DropTarget
中:
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(),
),
)
- 实现
_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
更多关于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_quill
和 flutter_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. 配置同步服务
SyncMeService
是 flutter_quill_extensions_syncme
提供的同步服务类,你需要根据实际需求配置同步服务的URL或其他参数。例如:
SyncMeService(
url: 'https://yoursyncservice.com',
// 其他配置参数
);
5. 处理同步事件
SyncMeController
提供了同步事件的处理方法,你可以监听同步事件并根据需要进行处理。例如:
_syncMeController.onSyncError.listen((error) {
// 处理同步错误
});
_syncMeController.onSyncSuccess.listen(() {
// 处理同步成功
});
6. 启动和停止同步
你可以通过 startSync
和 stopSync
方法来启动和停止同步:
_syncMeController.startSync();
_syncMeController.stopSync();