Skip to content

Commit 22c2aa4

Browse files
authored
fix[web]: unregister previously registered clipboard event listeners (#528)
Fixes #507 This happens because the dom listeners are not unregisterd at hot reload. The best way for this would be if flutter exposed `registerHotRestartListener` so we could have proper cleanup, but that's not the case. As a workaround we can store previous listeners in `window` object and unregister them during initialization.
1 parent fb0b35c commit 22c2aa4

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

super_native_extensions/lib/src/web/clipboard_events.dart

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'dart:js_interop';
2-
2+
import 'dart:js_interop_unsafe';
33
import 'package:web/web.dart' as web;
44

55
import '../clipboard_events.dart';
@@ -73,10 +73,29 @@ class _WriteEvent extends ClipboardWriteEvent {
7373
}
7474

7575
class ClipboardEventsImpl extends ClipboardEvents {
76+
static const listenersProperty =
77+
"super_native_extensions_clipboard_events_listeners";
78+
7679
ClipboardEventsImpl() {
77-
web.window.addEventListener('paste', _onPaste.toJS);
78-
web.window.addEventListener('copy', _onCopy.toJS);
79-
web.window.addEventListener('cut', _onCut.toJS);
80+
// Have no access to `registerHotRestartListener` so this needs to be done manually on startup.
81+
{
82+
final listeners = web.window.getProperty(listenersProperty.toJS)
83+
as JSArray<JSListener>?;
84+
if (listeners != null) {
85+
for (final listener in listeners.toDart) {
86+
web.window.removeEventListener(listener.type, listener.callback);
87+
}
88+
}
89+
}
90+
final listeners = [
91+
JSListener(type: 'paste', callback: _onPaste.toJS),
92+
JSListener(type: 'copy', callback: _onCopy.toJS),
93+
JSListener(type: 'cut', callback: _onCut.toJS),
94+
];
95+
for (final listener in listeners) {
96+
web.window.addEventListener(listener.type, listener.callback);
97+
}
98+
web.window.setProperty(listenersProperty.toJS, listeners.toJS);
8099
}
81100

82101
@override

0 commit comments

Comments
 (0)