JS interop: jsify and dartify #21311
Labels
area-core-library
SDK core library issues (core, async, ...); use area-vm or area-web for platform specific libraries.
area-web
Use area-web for Dart web related issues, including the DDC and dart2js compilers and JS interop.
library-js
type-enhancement
A request for a change that isn't a bug
web-js-interop
Issues that impact all js interop
JsObject.jsify currently takes a map or iterable.
...A scenario I ran into was sending a dynamic value to JS - I currently have to inspect the value to see if it should be sent to jsify or not.
Proposal: a more general jsify method (global in the js package?) that takes any Dart value (including null) and returns the "best" JS representation of it (JsObject, JsArray or unchanged for primitives)
In the opposite direction, a "dartify" method that returns usable Dart values (Map, List, or primitive) would be useful.
Here's my current work-around implementation of jsify and dartify. Note the horrible hacks I had to do.
dynamic dartify(dynamic arg) {
if (arg is js.JsArray) {
return arg.toList();
}
if (arg is js.JsObject) {
// TODO(tfortes): Find a better way to convert the js object to a Map.
// https://code.google.com/p/dart/issues/detail?id=12997
String json = js.context['JSON'].callMethod('stringify', [arg]);
return JSON.decode(json);
}
return arg;
}
dynamic jsify(dynamic arg) {
if (arg is Map || arg is Iterable) {
return new js.JsObject.jsify(arg);
}
// Primitives are fine as-is. Other objects
// will end up as opaque in JavaScript.
return arg;
}
The text was updated successfully, but these errors were encountered: