flutter_js_engine
源碼
JsEngine是基于webview_flutter插件內(nèi)置的JS Runtime實(shí)現(xiàn)的JS擴(kuò)展,能夠?qū)崿F(xiàn)動(dòng)態(tài)運(yùn)行JavaScript腳本面睛,相比flutter_js等三方庫更輕量級(jí)涩维,不需要增加額外的size毒坛,能夠支持JS HTTP網(wǎng)絡(luò)請(qǐng)求铃诬、SP數(shù)據(jù)持久化以及對(duì)promise的支持宛逗。
由于本引擎是基于WebView內(nèi)核實(shí)現(xiàn),能夠通過Google和AppStore審核。
接入方式:https://pub.dev/packages/flutter_js_engine
Http請(qǐng)求
JsEngine內(nèi)置了網(wǎng)絡(luò)請(qǐng)求接口萤悴,支持promise語法。
JS發(fā)起Http請(qǐng)求:
HttpSender.sendRequest("https://www.baidu.com/s", null, null, {
"wd": "%E6%97%A5%E5%8E%86"
}, "GET").then((value) =>{
console.log("sendRequest ok: ", value);
run_callback(value); // 返回?cái)?shù)據(jù)到dart層
});
數(shù)據(jù)存儲(chǔ)
JsEngine內(nèi)置支持?jǐn)?shù)據(jù)以key-value
的形式持久化存儲(chǔ)皆的,同時(shí)也支持promise語法覆履。
JS存儲(chǔ)和讀取數(shù)據(jù):
SpStorage.set("ijk", "oh yep");
SpStorage.get("ijk").then((value) =>{
console.log("SpStorage got ijk promise value:", value);
});
傳參
?? JsEngine約定以‘run_’前綴的變量名作為引擎內(nèi)置的全局變量。
- 接口通過params進(jìn)行傳參,在JS腳本中可通過內(nèi)置的
run_params
獲取傳入的運(yùn)行參數(shù):
JsEngine.runCode('console.log("run_params:", run_params);', params: 'dadada');
- 在JS中獲取參數(shù)
console.log("run_params:", run_params);
運(yùn)行環(huán)境信息
獲取JS運(yùn)行環(huán)境的信息:
JsEngine.runCode('console.log("run_info:", run_info['system']);');
目前支持的信息包括:
字段名 | 定義 |
---|---|
system | 系統(tǒng) |
system_ver | 系統(tǒng)版本 |
locale | 語言碼 |
engine_ver | 引擎版本 |
預(yù)加載全局lib
默認(rèn)情況下硝全,JsEngine.runCode()
是在隔離環(huán)境中運(yùn)行栖雾,但JsEngine同時(shí)也支持全局模式:
JsEngine.loadLib('');
代理日志輸出
代理日志能夠讓JS輸出日志到dart層:
JsEngine.setLogProxy((tag, log) {
print('$tag: $log');
});
JS調(diào)用
run_log("hello world!");
完整示例
JsEngine.setDebugMode(true);
JsEngine.setLogProxy((tag, log) {
print(log);
});
JsEngine.runCode('''
console.log("run_params:", run_params);
console.log("run_info:", run_info['system']);
HttpSender.sendRequest("https://www.baidu.com/s", null, null, {
"wd": "%E6%97%A5%E5%8E%86"
}, "GET").then((value) =>{
console.log("sendRequest ok: ", value);
run_callback(value);
});
SpStorage.set("abc", "???? Yogi ?????? ????????? |");
SpStorage.set("ijk", "oh yep");
SpStorage.get("abc").then((value) =>{
console.log("SpStorage got abc promise value:", value);
});
SpStorage.get("ijk").then((value) =>{
console.log("SpStorage got ijk promise value:", value);
});
''', params: 'dadada', callback: (json) {
logI('JsEngine-console runJsCode res: $json');
}).then((json) {
logI('JsEngine-console future runJsCode res: $json');
});