[Memory leak] Handle dispose in MobileEditorWidget

This commit is contained in:
Dang Dat
2025-12-23 13:56:52 +07:00
committed by Dat H. Pham
parent a286dd5dd8
commit a31898185e
2 changed files with 27 additions and 9 deletions
+7 -3
View File
@@ -48,8 +48,11 @@ class HtmlUtils {
editor.parentNode.replaceChild(newEditor, editor);''', editor.parentNode.replaceChild(newEditor, editor);''',
name: 'unregisterDropListener'); name: 'unregisterDropListener');
static registerSelectionChangeListener(String viewId) => ( static ({String name, String script}) registerSelectionChangeListener(
script: ''' String viewId,
) =>
(
script: '''
let lastSelectedText = ''; let lastSelectedText = '';
const sendSelectionChangeMessage = (data) => { const sendSelectionChangeMessage = (data) => {
@@ -149,7 +152,8 @@ class HtmlUtils {
} }
}); });
''', ''',
name: 'onSelectionChange'); name: 'onSelectionChange',
);
static const collapseSelectionToEnd = ( static const collapseSelectionToEnd = (
script: ''' script: '''
@@ -38,6 +38,8 @@ class MobileEditorWidget extends StatefulWidget {
class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMixin { class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMixin {
late String _createdViewId; late String _createdViewId;
InAppWebViewController? _editorController;
({String name, String script})? registerSelectionChange;
@override @override
void initState() { void initState() {
@@ -45,17 +47,29 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
_createdViewId = HtmlUtils.getRandString(10); _createdViewId = HtmlUtils.getRandString(10);
} }
@override
void dispose() {
if (registerSelectionChange != null) {
_editorController?.removeJavaScriptHandler(
handlerName: registerSelectionChange!.name,
);
}
_editorController?.dispose();
_editorController = null;
super.dispose();
}
@override @override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged; void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
Future<void> _setupSelectionListener(HtmlEditorApi editorApi) async { Future<void> _setupSelectionListener(HtmlEditorApi editorApi) async {
final webViewController = editorApi.webViewController; _editorController = editorApi.webViewController;
final registerSelectionChange = registerSelectionChange =
HtmlUtils.registerSelectionChangeListener(_createdViewId); HtmlUtils.registerSelectionChangeListener(_createdViewId);
webViewController.addJavaScriptHandler( _editorController?.addJavaScriptHandler(
handlerName: registerSelectionChange.name, handlerName: registerSelectionChange!.name,
callback: (args) { callback: (args) {
if (!mounted) return; if (!mounted) return;
@@ -68,8 +82,8 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
}, },
); );
await webViewController.evaluateJavascript( await _editorController?.evaluateJavascript(
source: registerSelectionChange.script, source: registerSelectionChange!.script,
); );
} }