@@ -4,6 +4,7 @@ library react_client.event_helpers;
44import 'dart:html' ;
55
66import 'package:js/js_util.dart' ;
7+ import 'package:meta/meta.dart' ;
78import 'package:react/react_client/js_interop_helpers.dart' ;
89import 'package:react/src/react_client/synthetic_data_transfer.dart' ;
910import 'package:react/src/react_client/synthetic_event_wrappers.dart' ;
@@ -72,7 +73,7 @@ SyntheticMouseEvent wrapNativeMouseEvent(MouseEvent nativeEvent) {
7273 'clientX' : nativeEvent.client.x,
7374 'clientY' : nativeEvent.client.y,
7475 'ctrlKey' : nativeEvent.ctrlKey,
75- 'dataTransfer' : nativeEvent.dataTransfer ,
76+ 'dataTransfer' : nativeEvent.safeDataTransfer ,
7677 'metaKey' : nativeEvent.metaKey,
7778 'pageX' : nativeEvent.page.x,
7879 'pageY' : nativeEvent.page.y,
@@ -823,3 +824,28 @@ extension DataTransferHelper on SyntheticMouseEvent {
823824 /// See <https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/dataTransfer>
824825 SyntheticDataTransfer ? get dataTransfer => syntheticDataTransferFactory (getProperty (this , 'dataTransfer' ));
825826}
827+
828+ extension SafeNativeDataTransfer on MouseEvent {
829+ /// In Dart SDK versions with null-safety enabled,
830+ /// [the interop] (https://github.com/dart-lang/sdk/blob/master/sdk/lib/html/dart2js/html_dart2js.dart#L22421-L22422)
831+ /// for [MouseEvent.dataTransfer] is non-nullable despite the
832+ /// [JS spec for `dataTransfer`] (https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/dataTransfer)
833+ /// clearly indicating that it can be null.
834+ ///
835+ /// This can cause the SDK to throw when a `MouseEvent` is manually constructed, and the `dataTransfer`
836+ /// getter is then accessed when running with `sound_null_safety` enabled:
837+ /// ```
838+ /// Unexpected null value encountered in Dart web platform libraries.
839+ /// ```
840+ ///
841+ /// This extension is used to catch the error within our [wrapNativeMouseEvent] function so that
842+ /// `SyntheticMouseEvent` s do not throw the null exception.
843+ @internal
844+ DataTransfer ? get safeDataTransfer {
845+ DataTransfer ? dataTransfer;
846+ try {
847+ dataTransfer = this .dataTransfer;
848+ } catch (_) {}
849+ return dataTransfer;
850+ }
851+ }
0 commit comments