evalJavascript method
Implementation
Future<dynamic> evalJavascript(
String code, {
bool wrapPromise = true,
bool allowRepeat = true,
}) async {
// check if there's a same request loading
if (!allowRepeat) {
for (String i in _msgCompleters.keys) {
String call = code.split('(')[0];
if (i.contains(call)) {
print('request $call loading');
return _msgCompleters[i]!.future;
}
}
}
if (!wrapPromise) {
final res =
await _web!.webViewController.evaluateJavascript(source: code);
return res;
}
final c = new Completer();
final uid = getEvalJavascriptUID();
final jsCall = code.split('(');
final method = 'uid=$uid;${jsCall[0]}';
_msgCompleters[method] = c;
final script = '$code.then(function(res) {'
' console.log(JSON.stringify({ path: "$method", data: res }));'
'}).catch(function(err) {'
' console.log(JSON.stringify({ path: "$method", error: err.message }));'
'});';
_web!.webViewController.evaluateJavascript(source: script);
_msgJavascript[jsCall[0]] = script;
return c.future;
}