@@ -58,12 +58,12 @@ class JsBackedMap extends MapBase<dynamic, dynamic> {
58
58
59
59
@override
60
60
dynamic operator [](Object key) {
61
- return js_util.getProperty (jsObject, key);
61
+ return _JsBackedMapValue . unwrapIfNeeded ( js_util.getProperty (jsObject, key) );
62
62
}
63
63
64
64
@override
65
65
void operator []= (dynamic key, dynamic value) {
66
- js_util.setProperty (jsObject, key, value);
66
+ js_util.setProperty (jsObject, key, _JsBackedMapValue . wrapIfNeeded ( value) );
67
67
}
68
68
69
69
@override
@@ -125,6 +125,28 @@ class JsBackedMap extends MapBase<dynamic, dynamic> {
125
125
}
126
126
}
127
127
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
+
128
150
/// A utility interop class for a plain JS "object"/"map"/"dictionary".
129
151
///
130
152
/// This class provides no functionality, and exists solely as a placeholder
0 commit comments