@@ -4,6 +4,7 @@ library react_client.event_helpers;
4
4
import 'dart:html' ;
5
5
6
6
import 'package:js/js_util.dart' ;
7
+ import 'package:meta/meta.dart' ;
7
8
import 'package:react/react_client/js_interop_helpers.dart' ;
8
9
import 'package:react/src/react_client/synthetic_data_transfer.dart' ;
9
10
import 'package:react/src/react_client/synthetic_event_wrappers.dart' ;
@@ -72,7 +73,7 @@ SyntheticMouseEvent wrapNativeMouseEvent(MouseEvent nativeEvent) {
72
73
'clientX' : nativeEvent.client.x,
73
74
'clientY' : nativeEvent.client.y,
74
75
'ctrlKey' : nativeEvent.ctrlKey,
75
- 'dataTransfer' : nativeEvent.dataTransfer ,
76
+ 'dataTransfer' : nativeEvent.safeDataTransfer ,
76
77
'metaKey' : nativeEvent.metaKey,
77
78
'pageX' : nativeEvent.page.x,
78
79
'pageY' : nativeEvent.page.y,
@@ -823,3 +824,28 @@ extension DataTransferHelper on SyntheticMouseEvent {
823
824
/// See <https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/dataTransfer>
824
825
SyntheticDataTransfer ? get dataTransfer => syntheticDataTransferFactory (getProperty (this , 'dataTransfer' ));
825
826
}
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