Flutter 与Android 原生通信的3种基本方式的使用

一、Flutter 与 原生通信的三种基本方式以及使用场景

1.MethodChannel

主要是用于Flutter调用原生的方法(执行一个原生的行为更合适)

2.BasicMessageChannel

用于Flutter Native双向流式通信

3.EventChannel

主要用于Native平台单独向Flutter发送事件消息流,更强调单向用途,比如传感器事件监听

二、快速示例

1.MethodChannel 基本用法

以下示例在Flutter中调用一个native方法,这个方法叫做test,并且携带了一个String类型的参数

Dart端

//第一步:创建MethodChannel对象,注意ID的唯一性
const nativeMethod = MethodChannel('com.test.method');//第二步:执行方法调用,这里执行一个叫test 的 native的方法,并且传输了一个String类型的参数
var res= await nativeMethod.invokeMethod("test","Hello I am argument");// res 就是原生的方法返回值

kotlin端

特别注意:
关于Native端的各种Channel初始化建议都放在

FlutterActivity#configureFlutterEngine

//第一步:创建MethodChannel对象
var methodChanel=MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger,"com.test.method");//第二步:设置Handler
methodChanel.setMethodCallHandler { call, result ->run {if (call.method == "test") {//test方法回应result.success("Hi your argument:"+call.arguments);} else {result.notImplemented()}}
}

2.BasicMessageChannel 的基本用法

Dart端


//第一步:创建BasicMessageChannel对象并确定编解码器
BasicMessageChannel<String> basicMessageChannel = BasicMessageChannel("com.test.basic", StringCodec());//第二步:发送消息(如果你需要)
void sendBasicMessage(String msg) {basicMessageChannel.send(msg);
}//第三步:设置消息Handhdler(接受到native的消息后,你需要做什么)
void setUpReceiveMessage(Function(dynamic content) callBackContent) {basicMessageChannel.setMessageHandler((dynamic message) async {// 处理收到的消息print('Received message: $message');callBackContent(message);return 'Received!';});
}

Kotlin端


//第一步:初始化(在FlutterActivity#configureFlutterEngine方法中做)
//注意这里的id是com.test.basic必须和dart端保持一致
var basicMessageChannel = BasicMessageChannel(flutterEngine!!.dartExecutor.binaryMessenger, "com.test.basic", StringCodec.INSTANCE);//第二步:设置Handler(当收到消息之后做什么)
basicMessageChannel.setMessageHandler { message, reply ->run {// 处理收到的消息d(tag, "收到Flutter消息 " + message);// 回复一个消息reply.reply("Reply from Java: received");sendMessage("Reply from Java: received");}
}//第三步:sendMessage(如果你又这个需要)
private fun sendMessage(message: String) {basicMessageChannel.send(message) { reply: String? ->// 处理Dart回复的消息d("MainActivity", "Received reply: $reply")}
}

3.EventChannel的基本用法

Dart 端

///第一步 初始化EventChanel,注意这里的Channel Id需要和native保持一致
EventChannel eventChannel = EventChannel('com.test.event/channel');// 第二步:注册监听(监听来自原生平台的数据流)
// 可以放在initState的方法中去做void listenToNativeStream(Function(dynamic content) eventCallBack) {eventChannel.receiveBroadcastStream().listen((dynamic event) {// 处理原生平台发来的数据print('Received event: $event');eventCallBack("${event}");}, onError: (dynamic error) {// 处理错误print('Received error: ${error.message}');});
}

kotlin端


//第一步:初始化(建议放在FlutterActivity#configureFlutterEngine方法中)var eventChannel =EventChannel(flutterEngine!!.dartExecutor.binaryMessenger,"com.test.event/channel")// 第二步:设置流处理器
eventChannel.setStreamHandler(object : EventChannel.StreamHandler {//注意这里有个坑:arguments 类型必须是Any? 如果是Any可能会因为发生运行时错误override fun onListen(arguments: Any?, events: EventSink) {//第三步:保存EventSink以便之后发送事件eventSink = events// 你可以在这里开始发送事件,比如连接到一个传感器或其他数据源}override fun onCancel(arguments: Any) {// 清理资源,停止发送事件eventSink = null}})//第四步:使用EventSink发送消息
private fun sendEventToFlutter(event: String) {if (eventSink != null) {eventSink!!.success(event)}
}

Demo 地址

https://gitee.com/wangzy2018/flutter-android-combine.git

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

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

相关文章

小程序项目思路分享爬虫

小程序项目思路分享爬虫 具体需求&#xff1a; 有这几个就行&#xff0c;门店名称门店地址门店类型&#xff0c;再加上省、市、县/区门店名称&#xff1a;storeName 门店地址&#xff1a;storeAddress 程序运行&#xff1a; honor_spider获取经纬度信息。 经纬度——>详…

「PHP系列」PHP 命名空间详解

文章目录 一、PHP命名空间1. 声明命名空间2. 使用命名空间3. 命名空间的作用范围4. 子命名空间5. 全局命名空间和非命名空间代码6. 命名空间与自动加载 二、PHP命名空间使用1. 基本使用2. 子命名空间3. 全局函数和常量4. 结合自动加载 三、相关链接 一、PHP命名空间 PHP 的命名…

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境&#xff0c;并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店&#xff0c;在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS&#xff1a;Clang这个插件别安装&…

【电路笔记】-逻辑或非门

逻辑或非门 文章目录 逻辑或非门1、概述2、晶体管逻辑或非门3、数字逻辑或非门类型4、通用或非门逻辑或非门是数字逻辑或门与反相器或非门串联的组合。 1、概述 或非(Not-OR)门的输出通常为逻辑电平“1”,并且仅当其任何输入处于逻辑电平“1”时才变为“低”至逻辑电平“0”…

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块…

力扣HOT100 - 73. 矩阵置零

解题思路&#xff1a; 题目要求使用原地算法 在原地算法中&#xff0c;输入数据通常在内存中直接被修改&#xff0c;而不需要额外的辅助数据结构来存储中间结果。原地算法的一个常见应用是在数组或列表上进行操作&#xff0c;而不是创建新的数组或列表来存储结果。 class So…

bash的login shell与non-login shell,以及各自的初始化过程

识别login shell与non-login shell login shell 可能是以-开头的 [almalinuxVM-AlmaLinux8-tmpl-wanlinwang ~]$ echo $0 -bash # "-" is the first character. Therefore, this is a login shell.或者以--login启动的bash [almalinuxVM-AlmaLinux8-tmpl-wanlinw…

Python自动打开Excel文件

导入必要的模块 import os import subprocess编写打开文件的函数 def open_file(file_path):"""打开指定路径下的文件。参数&#xff1a;file_path (str): 文件的路径。"""if os.name "nt": # 如果是 Windows 系统os.startfile(fi…

js面试---数据类型

1、js有哪些数据类型&#xff1f;有什么区别 js一共有Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt&#xff0c;八种数据类型。 Symbol&#xff1a;ES6新增数据类型&#xff0c;代表创建后独一无二且不可变的数据类型&#xff0c;主要是为了解决可能出现…

【截至2023年底】语言模型的发展

什么是大语言模型LLM&#xff1f;ChatGPT、LLAMA各自有什么优势&#xff1f; from&#xff1a; https://www.youtube.com/watch?vt6qBKPubEEo github&#xff1a; https://github.com/Mooler0410/LLMsPracticalGuide 来自这篇survey&#xff0c;但据说还在更新&#xff0c;到…

数据结构——线性表(顺序存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

设置MariaDB,创建新库,新用户并授权其可以从任何主机登录

OS:CENTOS 7 1、从系统进入MariaDB # mysql -u root -p 这里的root是指MariaDB的管理员用户&#xff0c;和系统的root不搭边&#xff0c;只是同名而已。 2、看下有哪些库、用户 MariaDB [(none)]> show databases; MariaDB [(none)]>select user,host from mysql.us…

MySQL:关于数据库的一些练习题

文章目录 前面的内容已经把数据库的一些必要知识已经储备好了&#xff0c;因此下面就对于这些语句进行一些练习&#xff1a; 批量插入数据 insert into actor values (1, PENELOPE, GUINESS, 2006-02-15 12:34:33), (2, NICK, WAHLBERG, 2006-02-15 12:34:33);SQL202 找出所有…

学习R语言第二天

R语言可以做什么 1.数据分析 R语言如何使用 1. 请看我的操作方式 2. 如何获取当前路径 -- 获取当前路径 > getwd() [1] "E:/R/RWorkSpace/day01" -- 修改当前路径 > setwd(dir "E:/R") > getwd() [1] "E:/R" 3.查看当下数据值的信…

java的this关键字 and 构造器

文章目录 构造器构造器的特点this关键字举个例子吧其他链接 不难理解&#xff0c;so easy!!! 构造器 People people new People(); // People类型&#xff1a;决定着对象的类型&#xff08;在内存中的构造形式&#xff09; // people对象名称&#xff0c;在栈内存当中 // new…

UT单元测试

Tips&#xff1a;在使用时一定要注意版本适配性问题 一、Mockito 1.1 Mock的使用 Mock 的中文译为仿制的&#xff0c;模拟的&#xff0c;虚假的。对于测试框架来说&#xff0c;即构造出一个模拟/虚假的对象&#xff0c;使我们的测试能顺利进行下去。 Mock 测试就是在测试过程…

Android 允许其他应用读取本应用的私有目录

在Android中&#xff0c;应用默认是封闭的&#xff0c;不允许其他应用访问自己的私有目录。但是&#xff0c;如果你想要让其他应用能够访问你的应用中的某些文件&#xff0c;你可以使用FileProvider类来实现这一功能。 以下是使用FileProvider的步骤&#xff1a; 1. 在你的应…

SAP Fiori开发中的JavaScript基础知识12 - 闭包,模块模式,回调函数

1. 前言 本文将介绍JavaScript中几个高阶的知识点&#xff1a;闭包&#xff0c;模块和回调。 2. 闭包 在JavaScript中&#xff0c;闭包是一个非常强大的特性&#xff0c;它允许函数记住并访问它的词法作用域&#xff0c;即使它在词法作用域之外执行。 简单来说&#xff0c;…

【CVE-2023-38831】进行钓鱼攻击的研究

本文仅仅是对相关漏洞利用的学习记录&#xff0c;请各位合法合规食用&#xff01; WinRAR是一款文件压缩器,该产品支持RAR、ZIP等格式文件的压缩和解压等。WinRAR在处理压缩包内同名的文件与文件夹时代码执行漏洞,攻击者构建由恶意文件与非恶意文件构成的特制压缩包文件,诱导受…

C# wpf 嵌入外部程序

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 嵌入外部程序&#xff08;本章&#xff09; 第五章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现&#xff1f;1、定义属性2、进程嵌入&#xff08;1&…