Skip to content

Commit 14458ca

Browse files
Work around new setProperty behavior when passed Dart functions
1 parent fc6a4fd commit 14458ca

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

lib/react_client/js_backed_map.dart

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ class JsBackedMap extends MapBase<dynamic, dynamic> {
5858

5959
@override
6060
dynamic operator [](Object key) {
61-
return js_util.getProperty(jsObject, key);
61+
return _JsBackedMapValue.unwrapIfNeeded(js_util.getProperty(jsObject, key));
6262
}
6363

6464
@override
6565
void operator []=(dynamic key, dynamic value) {
66-
js_util.setProperty(jsObject, key, value);
66+
js_util.setProperty(jsObject, key, _JsBackedMapValue.wrapIfNeeded(value));
6767
}
6868

6969
@override
@@ -125,6 +125,28 @@ class JsBackedMap extends MapBase<dynamic, dynamic> {
125125
}
126126
}
127127

128+
/// A wrapper around a value that can't be stored in its raw form
129+
/// within a JS object (e.g., a Dart function).
130+
class _JsBackedMapValue {
131+
final dynamic value;
132+
133+
const _JsBackedMapValue(this.value);
134+
135+
static dynamic wrapIfNeeded(dynamic value) {
136+
if (value is Function && !identical(allowInterop(value), value)) {
137+
return _JsBackedMapValue(value);
138+
}
139+
return value;
140+
}
141+
142+
static dynamic unwrapIfNeeded(dynamic value) {
143+
if (value is _JsBackedMapValue) {
144+
return value.value;
145+
}
146+
return value;
147+
}
148+
}
149+
128150
/// A utility interop class for a plain JS "object"/"map"/"dictionary".
129151
///
130152
/// This class provides no functionality, and exists solely as a placeholder

0 commit comments

Comments
 (0)