diff --git a/super_native_extensions/lib/src/web/clipboard_events.dart b/super_native_extensions/lib/src/web/clipboard_events.dart index 57205935..c36cce70 100644 --- a/super_native_extensions/lib/src/web/clipboard_events.dart +++ b/super_native_extensions/lib/src/web/clipboard_events.dart @@ -1,5 +1,5 @@ import 'dart:js_interop'; - +import 'dart:js_interop_unsafe'; import 'package:web/web.dart' as web; import '../clipboard_events.dart'; @@ -73,10 +73,29 @@ class _WriteEvent extends ClipboardWriteEvent { } class ClipboardEventsImpl extends ClipboardEvents { + static const listenersProperty = + "super_native_extensions_clipboard_events_listeners"; + ClipboardEventsImpl() { - web.window.addEventListener('paste', _onPaste.toJS); - web.window.addEventListener('copy', _onCopy.toJS); - web.window.addEventListener('cut', _onCut.toJS); + // Have no access to `registerHotRestartListener` so this needs to be done manually on startup. + { + final listeners = web.window.getProperty(listenersProperty.toJS) + as JSArray?; + if (listeners != null) { + for (final listener in listeners.toDart) { + web.window.removeEventListener(listener.type, listener.callback); + } + } + } + final listeners = [ + JSListener(type: 'paste', callback: _onPaste.toJS), + JSListener(type: 'copy', callback: _onCopy.toJS), + JSListener(type: 'cut', callback: _onCut.toJS), + ]; + for (final listener in listeners) { + web.window.addEventListener(listener.type, listener.callback); + } + web.window.setProperty(listenersProperty.toJS, listeners.toJS); } @override