convert js Map to dart Map

This commit is contained in:
wgh19
2024-05-03 11:53:16 +08:00
parent 2c7d60cc1c
commit 022ab462c6
9 changed files with 71 additions and 8 deletions

View File

@@ -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');

View File

@@ -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,

View File

@@ -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

View File

@@ -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) {