From 0e5556424d96fdd8d7a8fc9a3efee3180f1a4aba Mon Sep 17 00:00:00 2001 From: Alex Isaienko Date: Tue, 31 Jan 2023 22:09:54 +0200 Subject: [PATCH] Added `unknownEmbedBuilder` to QuillEditor (#1073) * Added `unknownEmbedBuilder` to QuillEditor * `unknownEmbedBuilder` constructor parameter --- lib/src/widgets/editor.dart | 39 ++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/lib/src/widgets/editor.dart b/lib/src/widgets/editor.dart index ec835d05..7dae5136 100644 --- a/lib/src/widgets/editor.dart +++ b/lib/src/widgets/editor.dart @@ -173,6 +173,7 @@ class QuillEditor extends StatefulWidget { this.onSingleLongTapMoveUpdate, this.onSingleLongTapEnd, this.embedBuilders, + this.unknownEmbedBuilder, this.linkActionPickerDelegate = defaultLinkActionPickerDelegate, this.customStyleBuilder, this.locale, @@ -359,6 +360,7 @@ class QuillEditor extends StatefulWidget { onSingleLongTapEnd; final Iterable? embedBuilders; + final EmbedsBuilder? unknownEmbedBuilder; final CustomStyleBuilder? customStyleBuilder; /// The locale to use for the editor toolbar, defaults to system locale @@ -491,7 +493,13 @@ class QuillEditorState extends State node, readOnly, ) => - _buildCustomBlockEmbed(node, context, controller, readOnly), + _buildCustomBlockEmbed( + node, + context, + controller, + readOnly, + widget.unknownEmbedBuilder, + ), linkActionPickerDelegate: widget.linkActionPickerDelegate, customStyleBuilder: widget.customStyleBuilder, floatingCursorDisabled: widget.floatingCursorDisabled, @@ -525,29 +533,38 @@ class QuillEditorState extends State return editor; } - Widget _buildCustomBlockEmbed(Embed node, BuildContext context, - QuillController controller, bool readOnly) { + Widget _buildCustomBlockEmbed( + Embed node, + BuildContext context, + QuillController controller, + bool readOnly, + EmbedsBuilder? unknownEmbedBuilder, + ) { final builders = widget.embedBuilders; + + var _node = node; + // Creates correct node for custom embed + if (node.value.type == BlockEmbed.customType) { + _node = Embed(CustomBlockEmbed.fromJsonString(node.value.data)); + } if (builders != null) { - var _node = node; - - // Creates correct node for custom embed - if (node.value.type == BlockEmbed.customType) { - _node = Embed(CustomBlockEmbed.fromJsonString(node.value.data)); - } - for (final builder in builders) { if (builder.key == _node.value.type) { return builder.build(context, controller, _node, readOnly); } } } + + if (unknownEmbedBuilder != null) { + return unknownEmbedBuilder(context, controller, _node, readOnly); + } throw UnimplementedError( 'Embeddable type "${node.value.type}" is not supported by supplied ' 'embed builders. You must pass your own builder function to ' - 'embedBuilders property of QuillEditor or QuillField widgets.', + 'embedBuilders property of QuillEditor or QuillField widgets or ' + 'specify an unknownEmbedBuilder.', ); }