我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flutterwebbridge通信总结分析详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flutterwebbridge通信总结分析详解

缘起

公司医疗业务人手比较少【小而美】的团队~ 较少采用的前端技术架构是:

toC:小程序 toB2C: Flutter + H5(SPA - React)【build ?? Android + IOS】 Flutter web + H5 【企业微信服务商应用】

toB: 后台端、 数据大屏 Vue

边缘业务:社区 平台 等 使用的 原生

  • 虽然团队不大但是技术挺杂的,至于为什么要在flutter 中加入 混合开发是因为想通过微架构模式拆分业务,达到资源最大程度的复用;通过 Flutter 解决平台间的复用;微架构的 单页面应用程序解决 业务间的复用。这个暂且不谈,本期整理一下 flutter 中的 bridge 通信;

架构图大致如下 ??

Flutter-web 2 H5.png

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() {
    
    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('加载结束');
                },

复制代码
  • xxBridgeFlutter 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包

以上就是Flutter web bridge 通信总结分析详解的详细内容,更多关于Flutter web bridge 通信总结的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flutterwebbridge通信总结分析详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flutterwebbridge通信总结分析详解

这篇文章主要为大家介绍了Flutterwebbridge通信总结分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-28

尾递归详细总结分析

关于递归操作,相信大家都已经不陌生。简单地说,一个函数直接或间接地调用自身,是为直接或间接递归
2022-11-15

结合Python的SimpleHTTPServer源码来解析socket通信

何谓socket 计算机,顾名思义即是用来做计算。因而也需要输入和输出,输入需要计算的条件,输出计算结果。这些输入输出可以抽象为I/O(input output)。 Unix的计算机处理IO是通过文件的抽象。计算机不同的进程之间也有输入输出
2022-06-04

Android NFC开发详解 总结和NFC读卡实例解析

文章目录 前言一、什么是NFC?二、基础知识1.什么是NDEF?2.NFC技术的操作模式3.标签的技术类型4.实现方式的分类5.流程 三、获取标签内容1.检查环境2.获取NFC标签2.1 Manifest中注册的方式获取Tag2
2023-08-24

Nginx access.log日志详解及统计分析小结

本文详细介绍了Nginxaccess.log日志的格式、字段解释和分析方法。日志分析可用于统计访问量,分析流量,识别错误,进行安全检测和性能分析。常用统计工具包括AWStats、Webalizer、GoAccess和Logstash+Elasticsearch+Kibana。本文还提供了统计示例,展示如何使用这些工具获取总访问量、平均响应时间、热门URL、异常活动等指标。
Nginx access.log日志详解及统计分析小结
2024-04-02

通过JDK源码分析关闭钩子详解

关闭钩子用户关闭关闭程序,需要做一些善后的清理工作,但问题是,某些用户不会按照推荐的方法关闭应用程序,肯能导致善后工作无法进行。像tomcat调用server的start方法启动容器,然后会逐级调用start。当发出关闭命令是会启动关闭功能
2023-05-30

通过JDK源码角度分析Long类详解

概况Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相
2023-05-30

总结分析Git pull 常见的错误及其解决方法

在使用 Git 进行项目协作时,我们经常会使用 git pull 命令来同步远程仓库中的代码到本地。尽管这个命令非常简单易用,但有时候可能会遇到各种各样的错误,甚至导致项目无法正常运行。本文将分析 Git pull 常见的错误及其解决方法。
2023-10-22

Discuz通信失败的原因分析及解决方法

《Discuz通信失败的原因分析及解决方法》Discuz作为一个知名的开源论坛系统,在网站建设中被广泛应用。然而,有时候在使用Discuz时会出现通信失败的情况,导致网站无法正常运行。本文将从通信失败的原因分析入手,并提供一些解决方法,同
Discuz通信失败的原因分析及解决方法
2024-03-10

详解:信息系统监理师历年试题分析与解答

摘要: 在备考信息系统监理师考试的时候很多考生可能会选择《信息系统监理师历年试题分析与解答》这本辅导教材进行学习,编程学习网小编就来给大家介绍一下《信息系统监理师历年试题分析与解答》,对于准备报考信息系统监理师的考生可以了解下。  《信息系统监理师历年试题分析与解答》于2010年清华大学出版社出版,由全国计算机专
详解:信息系统监理师历年试题分析与解答
2024-04-18

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录