Channel实现Flutter与原生平台之间的双向通信

文章目录

  • (一)通过MessageChannel实现Flutter与原生平台之间的双向通信
    • Flutter端实现MessageChannel通信步骤:
    • Android端实现MessageChannel通信步骤:
  • (二)通过MethodChannel实现Flutter与原生平台之间的双向通信
    • Flutter端实现MessageChannel通信步骤:
    • Android端实现MessageChannel通信步骤:
  • (三)通过EventChannel实现Flutter与原生平台之间的双向通信
    • Flutter端实现EventChannel通信步骤:
    • Android端实现EventChannel通信步骤:

首先,现在Android中进行注册与初始化:

    private void registerChannelFunction() {FlutterEngine flutterEngine = getFlutterEngine();if (flutterEngine == null) {Log.e("ERROR", "注册消息通道失败 FlutterEngine = null");return;}DartExecutor dartExecutor = flutterEngine.getDartExecutor();binaryMessenger = dartExecutor.getBinaryMessenger();messageChannelSendFunction();methodChannelSendFunction();eventChannelSendFunction();}

(一)通过MessageChannel实现Flutter与原生平台之间的双向通信

Flutter端实现MessageChannel通信步骤:

先定义messageChannel

static const basicMethodChannel = 
BasicMessageChannel("flutter_basic_method_channel", StandardMessageCodec());

发送message:

  Future<void> sendMessage(Map json) async {await basicMethodChannel.send(json);}

接收message:

  void receiveMessage() {basicMethodChannel.setMessageHandler((result) async {Map? map = result as Map?;int code = map?["code"];String message=map?["message"];setState(() {receive = "messageChannel receiveMessage 中的回调 code $code  message $message";print(receive);print("receiveMessage: code:$code message:$message");});return 'Flutter 已收到消息';});}

Android端实现MessageChannel通信步骤:

首先,先初始化 BasicMessageChannel 实例对象:

basicMessageChannel = new BasicMessageChannel<>(binaryMessenger, 
"flutter_basic_method_channel", StandardMessageCodec.INSTANCE);

然后为Message对象设置MessageHandler对象:

        basicMessageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler() {@Overridepublic void onMessage(@Nullable Object message, @NonNull BasicMessageChannel.Reply reply) {System.out.println("flutter 传来的数据为: "+message.toString());basicSendMessage();}});

(二)通过MethodChannel实现Flutter与原生平台之间的双向通信

Flutter端实现MessageChannel通信步骤:

定义methodChannel:

static const methodChannel = MethodChannel("flutter_method_channel");

然后通过methodChannel的invokeMethod进行消息的发送:

  static Future<dynamic> invokeNative(String method,{required Map<String, String> arguments}) async {if (arguments == null) {return await methodChannel.invokeMethod(method);} else {return await methodChannel.invokeMethod(method, arguments);}}

最后调用会返回一个结果,通过这个result拿到返回的数据:

    Map result = await invokeNative("test", arguments: {});int code = result["code"];String message = result["message"];setState(() {receive = "invokeNative 中的回调 code $code message $message";print(receive);});

Android端实现MessageChannel通信步骤:

先初始化MethodChannel的实例:

        mMethodChannel = new MethodChannel(binaryMessenger, channelName);

然后设置methodHandler,它会重写MethodCallHandler的onMethodCall方法:

    private MethodChannel.MethodCallHandler getMethodCallHandler() {return new MethodChannel.MethodCallHandler() {@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {String method = call.method;Object Arguments = call.arguments;Map<String, Object> arguments = null;if (null != Arguments) {arguments = (Map<String, Object>) Arguments;}if ("test".equals(method)) {Toast.makeText(this, "flutter 调用到了 android test 数据为 name :"+arguments.get("name") +" age : "+arguments.get("age"), Toast.LENGTH_SHORT).show();Map<String, Object> objectMap = new HashMap<>();objectMap.put("message", "result.success 返回给flutter的basic数据");objectMap.put("code", 300);result.success(objectMap);} else {result.notImplemented();}}};}

(三)通过EventChannel实现Flutter与原生平台之间的双向通信

Flutter端实现EventChannel通信步骤:

首先 初始化EventChannel实例:

static const eventChannel = EventChannel("flutter_event_channel");

然后设置Stream:

    eventChannel.receiveBroadcastStream().listen((event) {// int code = event["code"];// String message = event["message"];setState(() {// receive += "code $code message $message  ";// print("eventMessageListener: "+receive);print(event);});}, onError: (event) {});

Android端实现EventChannel通信步骤:

初始化EventChannel:

String channelName = "flutter_event_channel";
EventChannel eventChannel = new EventChannel(binaryMessenger, channelName);

然后调用setStreamHandler为EventChannel设置一个处理器:

        eventChannel.setStreamHandler(new EventChannel.StreamHandler() {@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {eventSink = events;startTimer();}@Overridepublic void onCancel(Object arguments) {}});

EventSink 接口中 , 有 3 个方法 :

  • success : 表示接收数据成功 ;
  • error : 表示接收数据出现错误 ;
  • endOfStream : 表示接收数据结束 ;

这样就完成了Flutter与Android原生之间的通信,IOS的不太熟,有需要可以搜一下,都大差不差,如果觉得博主写的对你有帮助,麻烦给个一键三连

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

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

相关文章

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时&#xff0c;往该按钮上方添加一个悬浮元素&#xff0c;通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class&#xff0c;才能通过uni.createSelectorQuery来获取每个元素的节点信息&#xff1b; 2. 添加一个与…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

7-Zip命令行调用命令收集(20个)

列出压缩文件的内容: 7z l archive.7z 解压压缩文件到当前目录: 7z x archive.7z 解压压缩文件到指定目录: 7z x archive.7z -o"C:\path\to\extract" 创建新的压缩文件 (添加到archive.7z): 7z a archive.7z file_to_compress 创建包含多个文件的压缩文件: 7z a arc…

【JVM】了解JVM规范中的虚拟机结构

目录 JVM规范的主要内容 1&#xff09;字节码指令集(相当于中央处理器CPU) JVM指令分类 2&#xff09;Class文件的格式 3&#xff09;数据类型和值 4&#xff09;运行时数据区 5&#xff09;栈帧 6&#xff09;特殊方法 7&#xff09;类库 JVM规范的主要内容 1&#…

Vue3+ElementPlus+TS开发业务功能的问题汇总(持续更新)

1.开发表单弹框功能时遇到两个问题&#xff1a;加入了校验规则后&#xff0c;无论下拉框是否选择数据下面的红色提示都会触发显示不会自动隐藏 &#xff1b; 另外&#xff0c;新增的功能在提交后数据无法重置&#xff0c;这种在修改时可能会出现&#xff0c;但新增正常情况是不…

走进C++:C到C++的过渡

目录 什么是C呢&#xff1f; C的发展史 多了一些吃前来很香的“语法糖”。 语法糖一&#xff1a;命名空间 命名空间有个强大的功能 如何使用 语法糖二&#xff1a;缺省参数 语法糖三&#xff1a;函数重载 语法糖四&#xff1a;引用 引用传参 引用返回 引用和…

【ZZULIOJ】1100: 求组合数(函数专题)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 马上要举办新生程序设计竞赛了&#xff0c;与以往不同的是&#xff0c;本次比赛以班为单位&#xff0c;为了全面衡量一个班级的整体水平&#xff0c;要求从一个班的m位同学中任选k位同学代表本…

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制&#xff08;2&#xff09; 计算fps帧率 用 adb shell dumpsys SurfaceFlinger --list 查询当前的SurfaceView&#xff0c;然后有好多行&#xff0c;再把要查询的行内容完整的传给 ad…

算法训练Day35 | ● 343. 整数拆分 ● 96.不同的二叉搜索树

343. 整数拆分 class Solution { public:int integerBreak(int n) {vector<int> dp(n1, 0);dp[2] 1;for(int i3; i<n1; i){for(int j 1; j<i/2; j){dp[i] max(dp[i], max(j*(i-j), j*dp[i-j]));}}return dp[n];} };参考文章&#xff1a;代码随想录-343. 整数拆分…

找不到msvcp140.dll无法执行代码的原因分析及修复方法

当用户在尝试运行某些应用程序或游戏时&#xff0c;可能会遇到系统弹出错误提示&#xff0c;显示“找不到msvcp140.dll无法执行代码”这一错误信息&#xff0c;它会导致程序无法正常启动。为了解决这个问题&#xff0c;我经过多次尝试和总结&#xff0c;找到了以下五种解决方法…

hadoop启动后没有namenode,datanode等解决方法

之前用的是虚拟机&#xff0c;在虚拟机上安装的hadoop&#xff0c;但是后来&#xff0c;电脑恢复出厂设置了&#xff0c;什么都重新开始。就在本地安装 Linux 子系统。 但是&#xff0c;有时候start-dfs.sh后&#xff0c;jps出现错误。 像这种拒绝连接 解决办法就是如下&…

我的创作纪念日1460天(4年)

机缘 作为一名技术爱好者&#xff0c;我最初成为创作者的初心源于对知识的渴望和对分享的热情。在参与多个实战项目的过程中&#xff0c;我积累了丰富的经验&#xff0c;这些经验不仅仅是代码和解决方案&#xff0c;更多的是对问题本质的理解和解决问题的思维方式。我意识到&a…

题目----力扣--移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…

如何编译不同目录下的两个文件

1.直接编译 2.打包成动静态库进行链接

【智能优化算法】蜜獾优化算法(Honey Badger Algorithm,HBA)

蜜獾优化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”&#xff08;IF 3.6&#xff09;的2022年智能优化算法 01.引言 蜜獾优化算法(Honey Badger Algorithm,HBA)受蜜獾智能觅食行为的启发&#xff0c;从数学上发展出一种求解优化问题的…

【AMBA Bus ACE 总线 9 -- Non-cache IO device】

请阅读【AMBA Bus ACE 总线与Cache 专栏 】 欢迎学习:【嵌入式开发学习必备专栏】 文章目录 ACE Non-cache IO device非缓存I/O的工作原理在ARM中配置非缓存I/O示例场景Non-cache IO device Cache 访问ACE Non-cache IO device 在ARM架构中,ACE(AXI Coherency Extension,…

Flask 统一拦截器

import osfrom flask import Flask, request, sessionapp Flask(__name__) app.config[SECRET_KEY] os.urandom(24) # 生成24位的随机数种子&#xff0c;用于产生SESSION IDapp.route(/article/<int:article_id>) def test(article_id):"""路由地址参数…

变量的细节

如何打印不同类型的整数常量 相似于我们需要去声明类型 public class Var {public static void main(String[] args) {// 1就是int类型常量System.out.println(1);// 120后面加一个L(l)表示他是一个long型的整数System.out.println(120l);} }如何打印不同类型的浮点数常量 与…

解决电脑睡眠后,主机ping不通VMware虚拟机

文章目录 问题解决方法方法一方法二注意 问题 原因&#xff1a;电脑休眠一段时间&#xff0c;再次打开电脑就ping不通VMware虚拟机。 解决方法 方法一 重启电脑即可&#xff0c;凡是遇到电脑有毛病&#xff0c;重启能解决90%问题。但是重启电脑比较慢&#xff0c;而且重启…

C++用类模板封装容器

要实现输出不同容器的值&#xff0c;且各容器包含的数据类型也不同&#xff0c;可以使用类模板和函数模板来实现。 示例代码如下&#xff1a; #include <iostream> #include <vector> #include <list>template <typename T> class Container { privat…