mirror of
https://github.com/wgh136/flutter_qjs.git
synced 2025-09-27 13:27:24 +00:00
convert js Map to dart Map
This commit is contained in:
@@ -51,25 +51,25 @@ class FlutterQjs {
|
||||
switch (type) {
|
||||
case JSChannelType.METHON:
|
||||
final pdata = ptr.cast<Pointer<JSValue>>();
|
||||
final argc = pdata.elementAt(1).value.cast<Int32>().value;
|
||||
final argc = (pdata + 1).value.cast<Int32>().value;
|
||||
final pargs = [];
|
||||
for (var i = 0; i < argc; ++i) {
|
||||
pargs.add(_jsToDart(
|
||||
ctx,
|
||||
Pointer.fromAddress(
|
||||
pdata.elementAt(2).value.address + sizeOfJSValue * i,
|
||||
(pdata + 2).value.address + sizeOfJSValue * i,
|
||||
),
|
||||
));
|
||||
}
|
||||
final JSInvokable func = _jsToDart(
|
||||
ctx,
|
||||
pdata.elementAt(3).value,
|
||||
(pdata + 3).value,
|
||||
);
|
||||
return _dartToJs(
|
||||
ctx,
|
||||
func.invoke(
|
||||
pargs,
|
||||
_jsToDart(ctx, pdata.elementAt(0).value),
|
||||
_jsToDart(ctx, pdata.value),
|
||||
));
|
||||
case JSChannelType.MODULE:
|
||||
if (moduleHandler == null) throw JSError('No ModuleHandler');
|
||||
|
@@ -759,6 +759,19 @@ final int Function(
|
||||
)>>('jsIsArray')
|
||||
.asFunction();
|
||||
|
||||
/// int32_t jsIsMap(JSContext *ctx, JSValueConst *val)
|
||||
final int Function(
|
||||
Pointer<JSContext> ctx,
|
||||
Pointer<JSValue> val,
|
||||
) jsIsMap = _qjsLib
|
||||
.lookup<
|
||||
NativeFunction<
|
||||
Int32 Function(
|
||||
Pointer<JSContext>,
|
||||
Pointer<JSValue>,
|
||||
)>>('jsIsMap')
|
||||
.asFunction();
|
||||
|
||||
/// DLLEXPORT int32_t jsIsError(JSContext *ctx, JSValueConst *val);
|
||||
final int Function(
|
||||
Pointer<JSContext> ctx,
|
||||
|
@@ -192,7 +192,7 @@ class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable {
|
||||
}
|
||||
|
||||
@override
|
||||
call(List<dynamic> args) => invoke(args);
|
||||
call(List<dynamic> args, [dynamic thisVal]) => invoke(args, thisVal);
|
||||
}
|
||||
|
||||
/// Dart function wrapper for isolate
|
||||
|
@@ -218,7 +218,20 @@ dynamic _jsToDart(Pointer<JSContext> ctx, Pointer<JSValue> val,
|
||||
jsFreeValue(ctx, jsProp);
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
} else if(jsIsMap(ctx, val) != 0) {
|
||||
final map = Map();
|
||||
final jsMap = _JSObject(ctx, val);
|
||||
void callback(key, value) {
|
||||
map[key] = value;
|
||||
};
|
||||
var jsFunc = jsEval(ctx, "(m, callback) => { m.forEach((value, key, _) => { callback(key, value) }) }", "eval", JSEvalFlag.GLOBAL);
|
||||
var func = _jsToDart(ctx, jsFunc) as JSInvokable;
|
||||
jsFreeValue(ctx, jsFunc);
|
||||
func.invoke([jsMap, callback]);
|
||||
jsMap.destroy();
|
||||
func.destroy();
|
||||
return map;
|
||||
} else{
|
||||
final ptab = malloc<Pointer<JSPropertyEnum>>();
|
||||
final plen = malloc<Uint32>();
|
||||
if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) {
|
||||
|
Reference in New Issue
Block a user