Android原生与flutter模块交互

Flutter定义了三种不同类型的Channel:
BasicMessageChannel:用于传递字符串和半结构化的信息,持续通信,收到消息后可以回复此次消息,如:Native将遍历到的文件信息陆续传递到Dart,在比如:Flutter将从服务端陆陆续获取到信息交个Native加工,Native处理完返回等;
MethodChannel:用于传递方法调用(method invocation)一次性通信:如Flutter调用Native拍照;
EventChannel: 用于数据流(event streams)的通信,持续通信,收到消息后无法回复此次消息,通过长用于Native向Dart的通信,如:手机电量变化,网络连接变化,陀螺仪,传感器等;
项目当前选择的Channel是BasicMessageChannel作为传输数据的通道。

BasicMessageChannel目前传递数据提供的几种消息类型分别是JSONMessageCodec、StandardMessageCodec、StringCodec、BinaryCodec四种类型。
当前项目选择以JSON格式进行数据传输,所以使用的消息类型是JSONMessageCodec。

JSONMessageCodec在flutter里面可传递的数据类型有5种:
分别是bool,num,String,List,Map
在这里插入图片描述
在这里插入图片描述

在项目中使用 BasicMessageChannel 通道 Flutter向Android原生接收与发送请求,Android原生向Flutter接收与发送请求则如下:

首先Flutter向Android原生交互需要先注册唯一标识,唯一标识两端必须一致,iOS原生也是一样

当前唯一标识 CHANNEL_NAME = "flutter_to_native_json_basic"

项目Flutter端代码,设置 BasicMessageChannel 消息通道的方式:

/// 指定原生端与flutter之间交互的消息通道
late BasicMessageChannel channel;/// 初始化消息通道
initChannel(Function(String)? toPage) {this.toPage = toPage;/// 创建 Flutter端和原生端的,相互通信的通道channel = const BasicMessageChannel(KtNativeConstant.CHANNEL_NAME, JSONMessageCodec());// 监听来自 原生端 的消息通道,原生端调用了函数,这个handler函数就会被触发channel.setMessageHandler(_handler);
}/// 监听来自 原生端 的消息通道
/// 原生端调用了函数,这个handler函数就会被触发
Future<dynamic> _handler(dynamic message) async {nativeBean = KtNativeBean.formJson(message);KtLog.e("nativeBean: key = ${nativeBean?.key}");/// 接受参数成功返回0给原生端return 0;
}/// flutter向原生端发送消息
flutterSendNativeData(Map<String, String> map) {channel.send(map).then((value) {KtLog.d("原生端接收成功的数据 value = $value");}).catchError((error) {/// 发送消息出现错误异常情况接收回调if (error is MissingPluginException) {KtLog.e("flutterSendNativeData ---- Error:notImplemented --- 未在原生端找到具体实现函数");} else {KtLog.e("flutterSendNativeData ---- Error:$error");}});
}

项目Android原生端代码,设置 BasicMessageChannel 消息通道的方式(原生项目首先需搭建与Flutter通讯的activity):
在 KtFlutterActivity 中 设置:

/**
* 原生端与Flutter交互的实例对象
*/
private var channel: KtJsonBasicMessageChannel? = null/**
* Flutter activity专属回调,在回调中注册与 Flutter 消息传输通道
* @param flutterEngine 项目 Flutter 引擎
*/
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)// 获取消息通道,并设置 Flutter 引擎channel = KtJsonBasicMessageChannel.getInstance(flutterEngine.dartExecutor.binaryMessenger)// 原生端通过通道发送数据到 Flutterchannel?.androidSendFlutterData(mutableMapOf("key" to "test key","customData" to hashMapOf<String, Any>(),"token" to "test token","epid" to "test epid","appId" to "test appId"))
}

原生端项目自定义的 KtJsonBasicMessageChannel 需继承于

BasicMessageChannel.MessageHandler<Any>
class KtJsonBasicMessageChannel private constructor(messenger: BinaryMessenger) : BasicMessageChannel.MessageHandler<Any>/**
* 项目全局的消息通道
*/
private lateinit var mChannel: BasicMessageChannel<Any>companion object {/*** 原生View 在Flutter引擎上注册的唯一标识,在Flutter端使用时必须一样*/val CHANNEL_NAME = "flutter_to_native_json_basic"/*** 单例对象* 使用 @Volatile 关键字确保instance字段的可见性,防止多线程环境下出现指令重排序导致的问题。*/@Volatileprivate var instance: KtJsonBasicMessageChannel? = null/*** 获取单例对象* @param messenger* @return*/fun getInstance(messenger: BinaryMessenger): KtJsonBasicMessageChannel {// 通过双重检查(Double-Checked)机制,在第一次调用getInstance()时进行加锁,确保只有一个线程能够创建实例。return instance ?: synchronized(this) {instance ?: KtJsonBasicMessageChannel(messenger).also { instance = it }}}
}/**
* 初始化消息通道
* @param messenger
*/
private fun initChannel(messenger: BinaryMessenger) {// 创建 Android端和Flutter端的,相互通信的通道,通道名称,两端必须一致mChannel = BasicMessageChannel(messenger, CHANNEL_NAME, JSONMessageCodec.INSTANCE)// 监听来自 Flutter端 的消息通道,Flutter端调用了函数,这个handler函数就会被触发mChannel.setMessageHandler(this)
}/**
* 监听来自 Flutter端 的消息通道
* @param message   Android端 接收到 Flutter端 发来的 数据对象
* @param reply     Android端 给 Flutter端 执行回调的接口对象
*/
override fun onMessage(message: Any?, reply: BasicMessageChannel.Reply<Any>) {// 回调结果对象,获取Flutter端传过来的数据val flutterData = KtJsonUtils.fromJson(message.toString(), HashMap::class.java)"flutter message = ${message?.toString() ?: ""}".loge()// 回调状态接口对象,返回给Flutter端reply.reply(message)
}/**
* Android原生端发送消息至Flutter端
* @param data  需要发送的消息
*/
fun androidSendFlutterData(data: MutableMap<String, Any>) {mChannel.send(data) { reply ->JqzLogUtils.eTag(AppConstants.LOG_HTTP_INFO_TAG, "从flutter 返回回来的数据 reply : $reply")}
}

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

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

相关文章

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候&#xff0c;遇到如下问题&#xff1a; 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

springboot数字化医院产科系统源码

目录 一、系统概述 二、开发环境 三、功能设计 四、功能介绍 一、系统概述 数字化产科是为医院产科量身定制的信息管理系统。它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。该系统由门诊系统、住院系统、数据统计模块三部分组成&#xff0c;与医院HIS、LI…

VMware Mac/Win 虚拟机软件介绍

VMware作为全球领先的虚拟化技术提供商&#xff0c;其Mac/Win虚拟机软件为用户带来了前所未有的跨平台操作体验。这款软件凭借其强大的功能和稳定的性能&#xff0c;成为了众多开发者、设计师、企业用户以及个人用户的首选工具。 强大的多操作系统支持 VMware Mac/Win 虚拟机…

轻松创建对象——简单工厂模式(Python实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;今天我们要聊的是设计模式中的“万能钥匙”——简单工厂模式。想象一下&#xff0c;如果每次你都得亲自动手创建各种对象&#xff0c;不仅累得像个陀螺&#xff0c;还可能搞得一团糟。别怕&#xff0c;简单工厂模式来拯救你&am…

2024年创业新商机组合拳“消费增值+二二复制”引流拓客新思路

文丨微三云胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;2024年各行各业面临企业经营瓶颈难的一年&#xff0c;国家也陆续推出了《关于打造消费新场景培育消费新增长点的措施》都是为了培育和壮大消费新增长点&#xff…

怎样恢复数据?电脑数据恢复方法详解!

在日常使用电脑或移动设备时&#xff0c;我们难免会遇到数据丢失的情况&#xff0c;如误删除文件、存储设备故障等。数据恢复成了许多人迫切需要解决的问题。本文将为您介绍几种高效的数据恢复方法&#xff0c;帮助您轻松找回丢失的文件。 一、了解数据丢失的原因 在恢复数据…

数据文件传输连接超时?镭速教你如何解决!

Mysql作为一个广泛使用的开源关系型数据库管理系统&#xff0c;以快速、可靠、易于使用、开源的特色闻名&#xff0c;使用 MySQL 来存储和管理数据&#xff0c;已经广泛应用于各个领域、各类大小型应用中。 图片源于网络 使用 MySQL 来存储和管理数据的应用中&#xff0c;与数…

关于 element-ui el-cascader 数据回显问题的解决方案

前言 这两天在使用 el-cascader 控件时&#xff0c;后端日期的数据如“2023-05-06”前端需要按照“年-月-日”的形式分割成三级联动&#xff0c;因为数据库保存的是完整的日期&#xff0c;前端数据回显时需要对后端返回的数据进行处理。 问题再现 联动下拉框的数据如下&#x…

【操作系统】进程管理——线程管理(个人笔记)

学习日期&#xff1a;2024.7.2 内容摘要&#xff1a;线程的概念、存在的意义、线程的属性&#xff0c;线程的实现方式&#xff0c;线程的状态与组织。 线程的概念 拿QQ来说&#xff0c;QQ既可以打视频电话&#xff0c;也可以在这同时进行文字聊天或传送文件&#xff0c;进程是…

零信任沙箱在数据安全领域的意义

在当今日益复杂的网络安全环境中&#xff0c;零信任沙箱作为一种前沿的安全防护技术&#xff0c;受到了广泛关注。而SDC沙箱作为零信任沙箱领域的佼佼者&#xff0c;凭借其独特的技术优势和卓越的价值&#xff0c;为企业和组织提供了强大的数据安全保障。本文将深入探讨SDC沙箱…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法&#xff1a; CREATE DATABASE dbname; 使用 createdb 命令来创建 语法&#xff1a; createdb [option...] [dbname [description]] 参数说明&#xff1a; dbname&#xff1a;要创建的数据库名。 description&…

成人职场商务英语学习柯桥外语学校|邮件中的“备注”用英语怎么说?

在英语中&#xff0c;"备注"通常可以翻译为"Notes" 或 "Remarks"。 这两个词在邮件中都很常用。例如: 1. Notes Notes: 是最通用和最常见的表达&#xff0c;可以用在各种情况下&#xff0c;例如&#xff1a; 提供有关电子邮件内容的附加信息 列…

每日一题——Python实现PAT乙级1100 校庆(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度分析 空间复杂度分析 总结 我要更强 方法一…

什么美业门店管理系统好用?2024美业收银系统软件排名分享

美业SAAS系统在美容、美发、美甲等行业中十分重要&#xff0c;这种系统为美业提供了一种数字化解决方案&#xff0c;帮助企业更高效地管理业务和客户关系。 美业门店管理系统通常提供预约管理、客户管理、库存管理、报表生成等一系列功能&#xff0c;以满足美容院、美发沙龙等…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

Linux 实现自定义系统调用,支持参数和结果返回

本文实现一个简单的系统调用实现&#xff0c;支持输入字符串参数&#xff0c;并返回一个结果字符串。 以下是验证步骤&#xff1a; 1. 添加系统调用编号 试验使用的是 x86_64 架构的 Linux 内核。 找到并编辑 arch/x86/entry/syscalls/syscall_64.tbl 文件&#xff0c;在文件…

机械行业常见问题及ERP解决办法

机械行业在全球经济一体化和技术进步背景下&#xff0c;面临着越来越多的挑战。为了在激烈的市场竞争中立于不败之地&#xff0c;企业需要找到合适的方法优化生产流程、降低成本、提升客户满意度。因此&#xff0c;有效地利用企业资源规划&#xff08;ERP&#xff09;解决方案变…

C# new关键字的三种用法

在C#中&#xff0c;new关键字具有多种不同的用途&#xff0c;主要包括以下三个&#xff1a; 1.作为运算符&#xff1a; 创建对象和调用构造函数&#xff1a;这是最常见的用法&#xff0c;用于在堆上分配内存并初始化一个类的新实例。例如&#xff1a; Person person new Pe…

65.WEB渗透测试-信息收集- WAF、框架组件识别(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;64.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;4&#xff09;-CSDN博客 waf绕…

DSSAT作物模建模实践方法

随着数字农业和智慧农业的发展&#xff0c;基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…