網站首頁 編程語言 正文
緣起
公司醫療業務人手比較少【小而美】的團隊~ 較少采用的前端技術架構是:
toC:小程序 toB2C: Flutter + H5(SPA - React)【build ???? Android + IOS】 Flutter web + H5 【企業微信服務商應用】
toB: 后臺端、 數據大屏 Vue
邊緣業務:社區 平臺 等 使用的 原生
- 雖然團隊不大但是技術挺雜的,至于為什么要在flutter 中加入 混合開發是因為想通過微架構模式拆分業務,達到資源最大程度的復用;通過 Flutter 解決平臺間的復用;微架構的 單頁面應用程序解決 業務間的復用。這個暫且不談,本期整理一下 flutter 中的 bridge 通信;
架構圖大致如下 ????
bridge 部分解決各端的
- 兼容性和平臺差異
- 不同操作系統之間的處理
- 各端之間跨端通信
- 第三方 SDK 調用整合
- 各端業務復用
- 解決各端之間 Auth 的授權整合
- ...
通信方式
老生常談了 其實就是 JS 和 dart 之間的相互調用和注入方法
APP 中 JS & dart call
- APP 中
app中主要是通過 webview 來通信和混合開發的方式大同小異;都是 H5 & App 各自注冊通過 postmessage | urlchange 來觸發調用
主要代碼:
通過 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('當前不是app環境,或者沒有Bridge 運行時哦 ~ !'); window.history.back(); return; } window.xxBridge.postMessage( JSON.stringify({ type: 'appPagePop', value: value, }), ); }; }
- Flutter 中調用 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('加載結束'); },
-
xxBridge
是Flutter JavascriptChannel
注入通信對象 -
onMessageReceived
接收 web端 postmessage 觸發 dart 方法 - web 端中
window.flutterMessage
注冊方法給 Flutter 在 app 中調用
至此 Flutter APP 和 H5 通信 基本是以上方式拓展,當然還有 Url 的方式 和 Storage 的方式這里不表;
Flutter web 中 JS & dart call
dart 調用 js
有2種方式
1. Promise js文件的方式被調用
定義方法
function print(msg) { return new Promise((resolve, reject) => { resolve('code : xxxxx') alert(msg) }); }
調用
import 'dart:js' as js; @JS() external print(String msg); var wxScanPromise = print('123'); String code = await jsUtil.promiseToFuture(wxScanPromise)
2. 通過 js.context 獲取上下文來調用
- 首先在 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 中注入方法調用類
-
js.context
來給 js 注入window下的全局方法
js 調用 dart
- 通過
js.context["myalert"] = myalert
注冊了方法 - 直接在js文件中調用
summary
之后我們可以在 xxBridge 中不斷的繼承 WeChat SDK、dingdingSDK、等等 和一些業務方法 通過 rollup
等一些工具 打包發布NPM包
原文鏈接:https://juejin.cn/post/7191835597546209341
相關推薦
- 2022-08-31 docker(alpine+golang)?中?hosts?不生效問題解決方法_docker
- 2022-07-20 C語言通過三步翻轉法實現單詞倒置詳解_C 語言
- 2022-08-29 Python常見異常處理總結_python
- 2022-11-19 C#?使用?Filestream?修改大文件指定位置數據_C#教程
- 2023-04-06 C語言中雙鏈表的基本操作_C 語言
- 2022-07-22 springboot登陸前后端及動態菜單
- 2022-04-23 Tooltip 組件:根據內容是否溢出判斷是否顯示 Tooltip
- 2022-12-29 React動態更改html標簽的實現方式_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支