網(wǎng)站首頁 編程語言 正文
緣起
公司醫(yī)療業(yè)務(wù)人手比較少【小而美】的團(tuán)隊~ 較少采用的前端技術(shù)架構(gòu)是:
toC:小程序 toB2C: Flutter + H5(SPA - React)【build ?? Android + IOS】 Flutter web + H5 【企業(yè)微信服務(wù)商應(yīng)用】
toB: 后臺端、 數(shù)據(jù)大屏 Vue
邊緣業(yè)務(wù):社區(qū) 平臺 等 使用的 原生
- 雖然團(tuán)隊不大但是技術(shù)挺雜的,至于為什么要在flutter 中加入 混合開發(fā)是因為想通過微架構(gòu)模式拆分業(yè)務(wù),達(dá)到資源最大程度的復(fù)用;通過 Flutter 解決平臺間的復(fù)用;微架構(gòu)的 單頁面應(yīng)用程序解決 業(yè)務(wù)間的復(fù)用。這個暫且不談,本期整理一下 flutter 中的 bridge 通信;
架構(gòu)圖大致如下 ??
bridge 部分解決各端的
- 兼容性和平臺差異
- 不同操作系統(tǒng)之間的處理
- 各端之間跨端通信
- 第三方 SDK 調(diào)用整合
- 各端業(yè)務(wù)復(fù)用
- 解決各端之間 Auth 的授權(quán)整合
- ...
通信方式
老生常談了 其實就是 JS 和 dart 之間的相互調(diào)用和注入方法
APP 中 JS & dart call
- APP 中
app中主要是通過 webview 來通信和混合開發(fā)的方式大同小異;都是 H5 & App 各自注冊通過 postmessage | urlchange 來觸發(fā)調(diào)用
主要代碼:
通過 Flutter webview中注入 flutter 的方法
Flutter端
javascriptChannels: <JavascriptChannel>[ JavascriptChannel( name: 'xxBridge', onMessageReceived: (JavascriptMessage jsMessage) { Map messageMap = json.decode(jsMessage.message); print(messageMap); if (messageMap['type'] == 'appPagePop') { Navigator.pop(context, messageMap['value']); return; } if (messageMap['type'] == 'navigateTo') { Map params = messageMap['params']; String patientCode = params['code']; Routes.navigateTo(context, messageMap['url'], params: {'id': UserUtil.transferCodeToId(patientCode)}); return; } }, ), ].toSet()
- H5端
export default class xxBridge { isApp: boolean; constructor() { /** * receipt app message callback func * @param message * @returns boolean */ window.flutterMessage = (message: string) => { console.log(message, ' receipt app message'); return true; }; } appPagePop = (value = false) => { if (!this.isApp) { console.log('當(dāng)前不是app環(huán)境,或者沒有Bridge 運(yùn)行時哦 ~ !'); window.history.back(); return; } window.xxBridge.postMessage( JSON.stringify({ type: 'appPagePop', value: value, }), ); }; }
- Flutter 中調(diào)用 H5 在window 注冊的方法
onPageFinished: (url) { print(url + '加載完成'); Map data = { 'doctorCode': UserUtil.doctorCode(), 'doctorName': SpUtil.getString(DOCTOR_NAME_KEY), }; var dataJson = json.encode(data); print(dataJson); _webviewController?.evaluateJavascript("getAppLoginInfo('$dataJson')").then((res) { print("evaluateJavascript-res: ${res}"); // evaluateJavascript-res: true }); // print('加載結(jié)束'); },
-
xxBridge
是Flutter JavascriptChannel
注入通信對象 -
onMessageReceived
接收 web端 postmessage 觸發(fā) dart 方法 - web 端中
window.flutterMessage
注冊方法給 Flutter 在 app 中調(diào)用
至此 Flutter APP 和 H5 通信 基本是以上方式拓展,當(dāng)然還有 Url 的方式 和 Storage 的方式這里不表;
Flutter web 中 JS & dart call
dart 調(diào)用 js
有2種方式
1. Promise js文件的方式被調(diào)用
定義方法
function print(msg) { return new Promise((resolve, reject) => { resolve('code : xxxxx') alert(msg) }); }
調(diào)用
import 'dart:js' as js; @JS() external print(String msg); var wxScanPromise = print('123'); String code = await jsUtil.promiseToFuture(wxScanPromise)
2. 通過 js.context 獲取上下文來調(diào)用
- 首先在 init 中注入方法
webapp main.dart
class Application { static Future init(ui.VoidCallback callback) async { DarttoJS().into(); } ... }
// This's a test dart to js func class DarttoJS { // js call dart static void myalert(String text) { Fluttertoast.showToast( msg: "This's JS pass on test !:$text", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, backgroundColor: Colors.red, textColor: Colors.white, fontSize: 16.0); } void into() { js.context["myalert"] = myalert; js.context.callMethod('onLogin'); } }
webaapp index 文件中添加 onLogin
const onLogin = () => { ... } export { onLogin }
- 在 init 中注入方法調(diào)用類
-
js.context
來給 js 注入window下的全局方法
js 調(diào)用 dart
- 通過
js.context["myalert"] = myalert
注冊了方法 - 直接在js文件中調(diào)用
summary
之后我們可以在 xxBridge 中不斷的繼承 WeChat SDK、dingdingSDK、等等 和一些業(yè)務(wù)方法 通過 rollup
等一些工具 打包發(fā)布NPM包
原文鏈接:https://juejin.cn/post/7191835597546209341
相關(guān)推薦
- 2022-08-26 C++宏函數(shù)和內(nèi)聯(lián)函數(shù)的使用_C 語言
- 2022-05-04 R語言向量下標(biāo)和子集的使用_R語言
- 2022-09-29 Kotlin協(xié)程Dispatchers原理示例詳解_Android
- 2022-10-20 Android開發(fā)App啟動流程與消息機(jī)制詳解_Android
- 2022-04-11 Entity?Framework?Core工具使用命令行_基礎(chǔ)應(yīng)用
- 2023-04-07 Python實現(xiàn)SVM支持向量機(jī)的示例代碼_python
- 2023-07-02 Pandas數(shù)據(jù)查詢的集中實現(xiàn)方法_python
- 2021-12-14 nginx.pid打開失敗以及失效的解決方案_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支