flutter_quill_extensions 9.4.7
flutter_quill_extensions: ^9.4.7 copied to clipboard
Embed extensions for flutter_quill including image, video, formula and etc.
Flutter Quill Extensions #
An extensions for flutter_quill to support embedding widgets like images, formulas, videos, and more.
Check Flutter Quill for details of use.
📚 Table of Contents #
📝 About #
Flutter Quill is a rich editor text.
It'd allow you to customize a lot of things,
it has custom embed builders that allow you to render custom widgets in the editor
This is an extension to extend its functionalities by adding more features like images, videos, and more
📦 Installation #
Before starting using this package, please make sure to install flutter_quill package first and follow its usage instructions.
dependencies:
flutter_quill_extensions: ^<latest-version-here>
OR
dependencies:
flutter_quill_extensions:
git: https://github.com/singerdmx/flutter-quill.git
path: flutter_quill_extensions
🛠 Platform Specific Configurations #
The package uses the following plugins:
galplugin to save images. For this to work, you need to add the appropriate configurations See https://github.com/natsuk4ze/gal#-get-started to add the needed lines.image_pickerplugin for picking images so please make sure to follow the instructionsyoutube_player_flutterplugin which usesflutter_inappwebviewwhich has a requirement on web, please follow this link to set up the support for webimage_pickerwhich also requires some configurations, follow this link. It's needed for Android, iOS, and macOS, we must inform you that you can't pick photos using the camera on a desktop so make sure to handle that if you plan on adding support for the desktop, this may change in the future, and for more info follow this linksuper_clipboardwhich needs some setup on Android only, it's used to support copying images and pasting them into editor then you must set up it, open the page in pub.dev and read theREADME.mdor click on this link to get the instructions.
The minSdkVersion is 23 as super_clipboard requires it
For loading the image from the internet
Android: you need to add permissions inAndroidManifest.xml, Follow this Android Guide or Flutter Networking for more info, the internet permission is included by default only for debugging, you need to follow this link to add it in the release version too. you should allow loading images and videos only for thehttpsprotocol but if you want http too then you need to configure your Android application to accepthttpin the release mode, follow this Android Cleartext / Plaintext HTTP page for more info.
macOS: you need to include a key in yourInfo.plist, follow this link to add the required configurations
🚀 Usage #
Start using the package in 3 steps:
-
Be sure to follow the Installation section.
-
This package already include
super_clipboardand will be used internally in this package, to use it influtter_quill, call this function before using any of the widgets or functionalitiesFlutterQuillExtensions.useSuperClipboardPlugin();super_clipboardis comprehensive plugin that provides many clipboard features for reading and writing of rich text, images and other formats.Executing this function will allow
flutter_quillto use modern rich text features to paste HTML and Markdown, support for Gif files, and other formats. -
Set the
embedBuildersandembedToolbarparams in configurations ofQuillEditorandQuillToolbarwith the values provided by this repository.Quill Toolbar:
QuillToolbar( configurations: QuillToolbarConfigurations( embedButtons: FlutterQuillEmbeds.toolbarButtons(), ), ),Quill Editor
Expanded( child: QuillEditor.basic( configurations: QuillEditorConfigurations( embedBuilders: kIsWeb ? FlutterQuillEmbeds.editorWebBuilders() : FlutterQuillEmbeds.editorBuilders(), ), ), )
⚙️ Configurations #
📦 Embed Blocks #
As of version flutter_quill 6.0.x, embed blocks are not provided by default
as part of Flutter quill.
Instead, it provides an interface for all the users to provide their implementations for embed
blocks.
Implementations for image, video, and formula embed blocks are proved in this package
The instructions for using the embed blocks are in the Usage section
🔍 Element properties #
Currently, the library has limited support for the image and video properties,
and it supports only 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;"
}
}
🔧 Custom Element properties #
Doesn't apply to official Quill JS
Define flutterAlignment` as follows:
{
"insert": {
"image": "https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png"
},
"attributes": {
"style": "flutterAlignment: topLeft"
}
}
This works for all platforms except Web
🖼️ Image Assets #
If you want to use image assets in the Quill Editor, you need to make sure your assets folder is assets otherwise:
QuillEditor.basic(
configurations: const QuillEditorConfigurations(
// ...
sharedConfigurations: QuillSharedConfigurations(
extraConfigurations: {
QuillSharedExtensionsConfigurations.key:
QuillSharedExtensionsConfigurations(
assetsPrefix: 'your-assets-folder-name', // Defaults to `assets`
),
},
),
),
);
This info is needed by the package to check if its asset image to use the AssetImage provider
🎯 Drag and drop feature #
Currently, the drag-and-drop feature is not officially supported, but you can achieve this very easily in the following steps:
-
Drag and drop require native code, you can use any Flutter plugin you like, if you want a suggestion we recommend desktop_drop, it was originally developed for desktop. It has support for the web as well as Android (that is not the case for iOS)
-
Add the dependency in your
pubspec.yamlusing the following command:flutter pub add desktop_dropand import it with
import 'package:desktop_drop/desktop_drop.dart'; -
in the configurations of
QuillEditor, use thebuilderto wrap the editor withDropTargetwhich comes fromdesktop_dropimport 'package:flutter_quill_extensions/flutter_quill_extensions.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(), ), ) -
Implement the
_onDragDone, it depends on your use case but this is just a simple example
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;
}
// To get this extension function please import flutter_quill_extensions
_controller.insertImageBlock(
imageSource: file.path,
);
scaffoldMessenger.showSnackBar(
const SnackBar(
content: Text('Image is inserted.'),
),
);
};
}
💡 Features #
## Features
— Easy to use and customizable
- Rich text, images and other formats
- Useful utilities and widgets
🤝 Contributing #
We welcome contributions!
Please follow these guidelines when contributing to our project. See CONTRIBUTING.md for more details.
🌟 Acknowledgments #
- Thanks to the Flutter Team
- Thanks to the welcoming community, the volunteers who helped along the journey, developers, contributors and contributors who put time and effort into everything including making all the libraries, tools, and the information we rely on
We are incredibly grateful to many individuals and organizations who have played a role in the project. This includes the welcoming community, dedicated volunteers, talented developers and contributors, and the creators of the open-source tools we rely on.