Flutter与Native通信原理剖析与实践

通信原理

我们分几种场景来介绍Flutter和Native之间的通信。

  • Native发送数据给Flutter
  • Flutter发送数据给Native
  • Flutter发送数据给Native,然后Native回传数据给Flutter

在这里插入图片描述

Flutter与Native通信机制

在讲解Flutter与Native之间是如何传递数据之前,我们先了解下Flutter与Native的通信机制,Flutter和Native的通信是通过Channel来完成的。

消息使用Channel(平台通道)在客户端(UI)和主机(平台)之间传递,如下图所示:
在这里插入图片描述

  • Channel所支持的数据类型对照表

在这里插入图片描述

  • Flutter定义了三种不同类型的Channel:
    1. BasicMessageChannel:用于传递字符串和半结构化的信息,持续通信,收到消息后可以回复此次消息,如:Native将遍历到的文件信息陆续传递到Flutter,在比如:Flutter将从服务端陆陆续续获取到信息交给Native加工,Native处理完返回等;
    2. MessageChannel:用于传递方法调用,一次性通信:如Flutter调用Native拍照;
    3. EventChannel:用于数据流的通信,持续通信,通常用于Native向Flutter的通信,如:手机电量变化,网络连接变化等;

这三种类型的Channel都是全双工通信,即A<=>B,Flutter可以主动发送消息给Native端,并且Native接收到消息后可以做出回应,同样,Native端可以主动发送消息给Flutter端,Flutter端接收到数据后返回给Native。

通信原理

在这里插入图片描述

  • 无论是哪一种类型的Channel,它能和Flutter进行通信主要是借助BinaryMessenger来实现的。
  • 三种类型的Channel在Flutter侧都有对应的实现。

实践

  • flutter主动发送数据给native,native接受到消息后回信给flutter
    1. Android端
class MainActivity : FlutterActivity() {override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "HiFlutterBridge")//HiFlutterBridge需要和flutter端的对应channel.setMethodCallHandler { call, result ->Log.e("HiFlutterBridge", "argus is ${call.arguments}")if (call.method == "goToNative") {val data = "Hello from native!"result.success(data)} else {result.notImplemented()}}}
  1. Flutter端
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';class HiFlutterBridge {static HiFlutterBridge _instance = HiFlutterBridge._();final MethodChannel _bridge = const MethodChannel("HiFlutterBridge");//需要和原生端的MethodChannel方法的第二个参数一致var _listener = {};HiFlutterBridge._() {_bridge.setMethodCallHandler((MethodCall call) {String method = call.method;if (_listener[method] != null) {return _listener[method](call);}return Future(() => null);});}static HiFlutterBridge getInstance() {return _instance;}register(String method, Function(MethodCall) callBack) {_listener[method] = callBack;}unRegister(String method) {_listener.remove(method);}goToNative(Map params) async {String result = await _bridge.invokeMethod("goToNative", params);debugPrint("HiFlutterBridge result is $result");}MethodChannel bridge() {return _bridge;}
}
  Widget build(BuildContext context) {// TODO: implement buildreturn Scaffold(resizeToAvoidBottomInset: false, // 设置为false以避免在打开软键盘时widget被顶上去body: HideKeyboard(child: Stack(children: <Widget>[Align(alignment: Alignment.center,child: ElevatedButton(onPressed: () => {//flutter向native端通信HiFlutterBridge.getInstance().goToNative({"test": "hello world"})},// style: ElevatedButton.styleFrom(//     minimumSize: const Size(100, 50),//     maximumSize: const Size(100, 50),//     shape://     RoundedRectangleBorder(borderRadius: BorderRadius.circular(30))),child: const Text('login'),),)],)));}
  • native主动发送数据给flutter,flutter接受到消息后回信给native
    1. Android端
class MainActivity : FlutterActivity() {override fun onResume() {super.onResume()sendDataToFlutter()}private fun sendDataToFlutter() {val channel = MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, "test")channel.invokeMethod(" sendData ", "Hello Flutter", object : MethodChannel.Result {override fun success(o: Any?) {Log.d("Native", "Received back: " + o.toString())}override fun error(s: String, s1: String?, o: Any?) {Log.e("Native", "Error: $s1")}override fun notImplemented() {}})}
}
  1. Flutter端
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';class HiFlutterBridge {static HiFlutterBridge _instance = HiFlutterBridge._();final MethodChannel _bridge = const MethodChannel("test");var _listener = {};HiFlutterBridge._() {_bridge.setMethodCallHandler((MethodCall call) async{debugPrint("test ===> ${call}");return "flutter ===> native";String method = call.method;if (_listener[method] != null) {return _listener[method](call);}return Future(() => null);});}static HiFlutterBridge getInstance() {return _instance;}register(String method, Function(MethodCall) callBack) {_listener[method] = callBack;}unRegister(String method) {_listener.remove(method);}goToNative(Map params) async {String result = await _bridge.invokeMethod("goToNative", params);debugPrint("HiFlutterBridge result is $result");}MethodChannel bridge() {return _bridge;}
}
  void initState() {// TODO: implement initStatesuper.initState();HiFlutterBridge.getInstance();}
  • 运行结果
I/flutter (27181): test ===> MethodCall( sendData , Hello Flutter)
D/Native  (27181): Received back: flutter ===> native

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137737.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL16源码包编译安装

一、安装环境 操作系统&#xff1a;CentOS Linux release 7.8.2003 (Core) PostgreSQL版本&#xff1a;16 服务器IP地址&#xff1a;192.168.0.244 Firewalld关闭、selinux关闭 笔者本次选用最新v16版本进行部署 二、pg数据库安装包下载 下载地址&#xff1a;https://www.po…

什么是IoT数字孪生?

数字孪生是资产或系统的实时虚拟模型&#xff0c;它使用来自连接的物联网传感器的数据来创建数字表示。数字孪生允许您从任何地方实时监控设备、资产或流程。数字孪生用于多种目的&#xff0c;例如分析性能、监控问题或在实施之前运行测试。从物联网数字孪生中获得的见解使用户…

操作系统备考学习 day3 (2.1.1 - 2.1.6)

操作系统备考学习 day3 二、进程与线程2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组织2.1.4 进程控制2.1.5 进程间通信&#xff08;IPC&#xff09;2.1.6 线程和多线程模型 二、进程与线程 2.1 进程与线程 2.1.1 进程的概念和特征 进程&#…

怎样获取某个文件的public方法个数

背景&#xff1a;idea 提供的list可以查看所有的构造方法&#xff0c;但是无法直接告诉我准确的数目&#xff0c;于是写了以下一个单独的类 import java.lang.reflect.Method; import java.lang.reflect.Modifier;public class MyPublicMethodCounter {public static void mai…

flink集群与资源@k8s源码分析-集群

0 介绍 本文是flink集群与资源@k8s源码分析系列的第二篇-集群 1 场景 下面详细分析各用例 2 启动k8s集群 k8s集群支持session和application模式,job模式将会被废弃,本文分析session模式集群 Configuration作为配置容器,几乎所有的构建需要从配置类获取配置项,这里不显示…

算法通关村第14关【黄金】| 数据流的中位数

思路&#xff1a;使用一个小根堆一个大根堆来找中位数 小根堆保存较大的一半数字&#xff0c;大根堆保存较小的一半数字 奇数queMin的队头即为中位数&#xff0c;偶数queMin和queMax队头相加/2为中位数 初始状态&#xff1a; queMin: [] queMax: [] 添加数字 1&#xff1a; …

java面试题基础第七天

一、java面试题第七天 1.throw和throws的区别&#xff1f; throw&#xff1a; 用于抛出一个异常对象throws&#xff1a;写在方法体上面&#xff0c;将方法体里面的异常&#xff0c;抛给上层 2. 通过故事讲清楚NIO 下面通过一个例子来讲解下。 假设某银行只有10个职员。该银…

stm32学习-芯片系列/选型

【03】STM32HAL库开发-初识STM32 | STM概念、芯片分类、命名规则、选型 | STM32原理图设计、看数据手册、最小系统的组成 、STM32IO分配_小浪宝宝的博客-CSDN博客  STM32&#xff1a;ST是意法半导体&#xff0c;M是MCU/MPU&#xff0c;32是32位。  ST累计推出了&#xff1a…

buuctf web [极客大挑战 2019]LoveSQL

又是这样的界面&#xff0c;这糟糕的熟悉感&#xff0c;依旧使用上题套路 用户名&#xff1a; admin or 11# 密码&#xff1a; 1 有一串很像flag的字符&#xff0c;但是很可惜&#xff0c;这不是flag 看了一眼源代码&#xff0c;没有可以跳转的页面 要换个思路了&#xff0c…

(二十九)大数据实战——kafka集群节点服役与退役案例实战

前言 本节内容是关于kafka集群节点的服役与退役&#xff0c;从而实现kafka集群的缩容与扩容。在开始本节内容之前&#xff0c;我们要预先安装好kafka集群&#xff0c;并准备一台空余的服务器用来完成我们扩容与缩容的案例。关于kafka集群的安装内容这里不在赘述&#xff0c;相…

Python Web 开发常见的100个问题.pdf

Python被广泛认为是一种容易学习和上手的编程语言&#xff0c;因此对于初学者和有经验的开发者都非常友好。这一特点使得Python成为了许多开发者入门Web开发的首选语言。 在Python Web开发中&#xff0c;开发者们通常会遇到各种各样的问题和挑战。现在我们为大家准备了学习路线…

PostgreSQL快速入门 与MySQL语法比较

开篇 本文可帮助具有MySQL基础的小伙伴对PostgreSQL做一个快速的入门&#xff0c;通过语法之间的差异对比&#xff0c;降低学习成本&#xff0c;同样都是数据库&#xff0c;正所谓触类旁通。 模式的概念 模式&#xff08;Schema&#xff09;表示数据库中的逻辑容器&#xff…

HTML 知识扫盲

写在前面 HTML 是一门超文本标记语言&#xff0c;不管你听没听说过 HTML&#xff0c;但在网上冲浪的途中你无时不刻都在与它接触&#xff0c;他遍布在每个你看得到的互联网的角落。其实对于笔者而言&#xff0c;我已经断断续续地学习过这门语言&#xff0c;经过时间的磋磨&…

docker学习1-基本概念

Docker jar包环境镜像&#xff0c;镜像存在docker仓库中&#xff0c;随用随取&#xff0c;无需现配环境 docker通过隔离机制&#xff0c;各个镜像之间互不干扰 docker比vm轻量化&#xff0c;每次只需运行镜像即可&#xff0c;镜像占内存小启动快&#xff0c;虚拟机启动慢&…

typeof的作用

typeof 是 JavaScript 中的一种运算符&#xff0c;用于获取给定值的数据类型。 它的作用是返回一个字符串&#xff0c;表示目标值的数据类型。通过使用 typeof 运算符&#xff0c;我们可以在运行时确定一个值的类型&#xff0c;从而进行相应的处理或逻辑判断。 常见的数据类型…

Java————List

一 、顺序表和链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c; 常见的线性表&#xff1a;顺序表、链表、栈、队列… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

ABeam Team Building |「TDC Green Day——夏日Go Green·畅享山海间 环保公益行动」回顾

夏日Go Green畅享山海间 GO!ABeam 夏日Go Green畅享山海间 夏末初秋时节&#xff0c;大连办公室的员工们来到了海滨的望渔山&逃之夭夭海滩&#xff0c;开启了主题为「夏日Go Green畅享山海间」的Team Building之旅。 本次的活动契合了大连办公室作为绿色办公&#xff08;…

Android Jetpack Compose之状态持久化与恢复

目录 1.概述2.实例解析4. Compose提供的MapSaver和ListSaver4.1 mapServer4.2 ListSaver 1.概述 在之前的文章中&#xff0c;我们提到了remember&#xff0c;我们都知道remember可以缓存创建状态&#xff0c;避免因为重组而丢失。使用remember缓存的状态虽然可以跨越重组&…

打造生产级Llama大模型服务

对于任何想要尝试人工智能或本地LLM&#xff0c;又不想因为意外的云账单或 API 费用而感到震惊的人&#xff0c;我可以告诉你我自己的旅程是如何的&#xff0c;以及如何开始使用廉价的消费级硬件执行Llama2 推理 。 这个项目一直在以非常活跃的速度发展&#xff0c;这使得它非…

Call短路触发版本SIP对讲求助终端

SV-2701VP Call短路触发版本SIP对讲求助终端 一、描述 SV-2701VP是我司的一款壁挂式求助对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;支持G.711与G.722音频解码&#xff0c;其接收SIP网络的音频数据&#xff0c;实时解码播放。配置一路线路输入&#xff0c;一路线…