Mutualize event listener in web editor widget
Instead of listening multiple times for message from editor JS side, let's add only one listener and route inside the callback.
This commit is contained in:
@@ -83,10 +83,8 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
|
|||||||
static const double _defaultHtmlEditorHeight = 550;
|
static const double _defaultHtmlEditorHeight = 550;
|
||||||
|
|
||||||
late HtmlEditorController _editorController;
|
late HtmlEditorController _editorController;
|
||||||
bool _dropListenerRegistered = false;
|
bool _editorListenerRegistered = false;
|
||||||
bool _selectionChangeListenerRegistered = false;
|
Function(Event)? _editorListener;
|
||||||
Function(Event)? _dropListener;
|
|
||||||
Function(Event)? _selectionChangeListener;
|
|
||||||
|
|
||||||
OverlayEntry? _signatureTooltipEntry;
|
OverlayEntry? _signatureTooltipEntry;
|
||||||
final GlobalKey _signatureTooltipKey = GlobalKey();
|
final GlobalKey _signatureTooltipKey = GlobalKey();
|
||||||
@@ -101,34 +99,25 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
|
|||||||
super.initState();
|
super.initState();
|
||||||
_editorController = widget.editorController;
|
_editorController = widget.editorController;
|
||||||
|
|
||||||
_dropListener = (event) {
|
_editorListener = (event) {
|
||||||
if (event is MessageEvent) {
|
|
||||||
if (jsonDecode(event.data)['name'] == HtmlUtils.registerDropListener.name) {
|
|
||||||
_editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (_dropListener != null) {
|
|
||||||
window.addEventListener("message", _dropListener!);
|
|
||||||
}
|
|
||||||
|
|
||||||
_selectionChangeListener = (event) {
|
|
||||||
try {
|
try {
|
||||||
if (event is MessageEvent) {
|
if (event is MessageEvent) {
|
||||||
final data = jsonDecode(event.data);
|
final data = jsonDecode(event.data);
|
||||||
|
|
||||||
if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) {
|
if (data['name'] == HtmlUtils.registerDropListener.name) {
|
||||||
|
_editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name);
|
||||||
|
} else if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) {
|
||||||
handleSelectionChange(data);
|
handleSelectionChange(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError(
|
logError(
|
||||||
'_WebEditorState::_selectionChangeListener: Unable to parse selection data = $e',
|
'_WebEditorState::_editorListener: Unable to parse message data = $e',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (_selectionChangeListener != null) {
|
if (_editorListener != null) {
|
||||||
window.addEventListener("message", _selectionChangeListener!);
|
window.addEventListener("message", _editorListener!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,13 +134,9 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
|
|||||||
void dispose() {
|
void dispose() {
|
||||||
_editorController.evaluateJavascriptWeb(
|
_editorController.evaluateJavascriptWeb(
|
||||||
HtmlUtils.unregisterDropListener.name);
|
HtmlUtils.unregisterDropListener.name);
|
||||||
if (_dropListener != null) {
|
if (_editorListener != null) {
|
||||||
window.removeEventListener("message", _dropListener!);
|
window.removeEventListener("message", _editorListener!);
|
||||||
_dropListener = null;
|
_editorListener = null;
|
||||||
}
|
|
||||||
if (_selectionChangeListener != null) {
|
|
||||||
window.removeEventListener("message", _selectionChangeListener!);
|
|
||||||
_selectionChangeListener = null;
|
|
||||||
}
|
}
|
||||||
_hideSignatureTooltip();
|
_hideSignatureTooltip();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
@@ -216,15 +201,12 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
|
|||||||
onChangeContent: widget.onChangeContent,
|
onChangeContent: widget.onChangeContent,
|
||||||
onInit: () {
|
onInit: () {
|
||||||
widget.onInitial?.call(widget.content);
|
widget.onInitial?.call(widget.content);
|
||||||
if (!_dropListenerRegistered) {
|
if (!_editorListenerRegistered) {
|
||||||
_editorController.evaluateJavascriptWeb(
|
_editorController.evaluateJavascriptWeb(
|
||||||
HtmlUtils.registerDropListener.name);
|
HtmlUtils.registerDropListener.name);
|
||||||
_dropListenerRegistered = true;
|
|
||||||
}
|
|
||||||
if (!_selectionChangeListenerRegistered) {
|
|
||||||
_editorController.evaluateJavascriptWeb(
|
_editorController.evaluateJavascriptWeb(
|
||||||
HtmlUtils.registerSelectionChangeListener.name);
|
HtmlUtils.registerSelectionChangeListener.name);
|
||||||
_selectionChangeListenerRegistered = true;
|
_editorListenerRegistered = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onFocus: widget.onFocus,
|
onFocus: widget.onFocus,
|
||||||
|
|||||||
Reference in New Issue
Block a user