Flutter项目和鸿蒙平台的通信

news2025/1/21 8:25:50

Flutter项目和鸿蒙平台的通信

  • 前言
  • Flutter和Harmonyos通信
    • MethodChannel
    • BasicMessageChannel
    • EventChannel

前言

大家在使用Flutter开发项目的时候, Flutter提供了Platfrom Channel API来和个个平台进行交互。

Flutter官方目前提供了一下三种方式来和个个平台交互:

  • BasicMessageChannel:用于传递字符串和半结构化的信息。BasicMessageChannel支持数据双向传递,有返回值。
  • MethodChannel:用于传递方法调用(method invocation)。MethodChannel支持数据双向传递,有返回值。通常用来调用 native 中某个方法
  • EventChannel: 用于数据流(event streams)的通信。 EventChannel仅支持数据单向传递,无返回值。有监听功能,比如电量变化之后直接推送数据给flutter端
    对比表格:
    在这里插入图片描述
    flutter_flutter 也是通过上述三种方式来和鸿蒙平台进行通信的

Flutter和Harmonyos通信

MethodChannel

  • flutter代码:
// 创建一个通道
final _platform = const MethodChannel('samples.flutter.dev/battery');

Future<void> _getBatteryLevel() async {
    String batteryLevel;
    try {
      // getBatteryLevel 是flutter传递给鸿蒙平台的参数
      final result = await _platform.invokeMethod<int>('getBatteryLevel');
      batteryLevel = 'Battery level at $result % .';
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get battery level: '${e.message}'.";
    }
  }

鸿蒙平台代码:

// 实现这个声明周期方法,在plugin中
onAttachedToEngine(binding: FlutterPluginBinding): void {
// 创建一个通道, 通道名称需要和flutter创建的通道名称保持一致,才可以通信
    this.channel = new MethodChannel(binding.getBinaryMessenger(), "samples.flutter.dev/battery");
    let that = this;
  	// 实现通道的回调方法
    this.channel.setMethodCallHandler({
      onMethodCall(call: MethodCall, result: MethodResult) {
        switch (call.method) {
        // 接收到flutter传递过来的参数
          case "getBatteryLevel":
          	// 执行对应的方法, 然后把结果传递给flutter
            that.api.getBatteryLevel(result);
            break;
          default:
            result.notImplemented();
            break;
        }
      }
    })  
  }

// 获取电池电量的类
class BatteryApi {
  getBatteryLevel(result: MethodResult) {
    let level: number = batteryInfo.batterySOC;
    Log.i(TAG, "level=" + level);
    let wrapped: Map<String, Any> = new Map<String, Any>();
    if (level >= 0) {
      result.success(level);
    } else {
      Log.i(TAG, "getBatteryLevel else");
      wrapped.set("UNAVAILABLE", "Battery level not available.");
      result.error("UNAVAILABLE", "Battery level not available.", null)
    }
    Log.i(TAG, "getBatteryLevel finish");
  }
}

BasicMessageChannel

Flutter代码:

// 创建一个基础通道, 通道名需要和鸿蒙平台约定好
final _basicChannel = const BasicMessageChannel(
      "samples.flutter.dev/basic_channel", StandardMessageCodec());
      _testBasicChannel() async {
    String result;
    try {
      result = await _basicChannel.send(++count) as String;
    } on PlatformException catch (e) {
      result = "Error: $e";
    }
    setState(() {
      message = result;
    });
  }

鸿蒙平台代码:

onAttachedToEngine(binding: FlutterPluginBinding): void {
    // 创建实例
    this.basicChannel = new BasicMessageChannel(binding.getBinaryMessenger(), "samples.flutter.dev/basic_channel", new StandardMessageCodec());
    // 设置回调,调用具体的实现
    this.basicChannel.setMessageHandler({
        onMessage(message: Any, reply: Reply<Any>) {
        Log.i(TAG, "message=" + message);
        if (message % 2 == 0) {
            reply.reply("run with if case.");
        } else {
            reply.reply("run with else case");
        }
        }
    })
}

EventChannel

flutter代码:

// 创建实例
final _eventChannel = const EventChannel('samples.flutter.dev/event_channel');
// 注册事件监听
_eventChannel.receiveBroadcastStream().listen((event) {
    setState(() {
        message = "EventChannel event=$event";
    });
});

鸿蒙平台代码:

onAttachedToEngine(binding: FlutterPluginBinding): void {
    let that = this;
    // 创建实例
    this.eventChannel = new EventChannel(binding.getBinaryMessenger(), "samples.flutter.dev/event_channel");
    // 设置回调,获取EventSink
    this.eventChannel.setStreamHandler({
        onListen(args: Any, events: EventSink): void {
            that.eventSink = events;
            Log.i(TAG, "onListen: " + args);
        },
        onCancel(args: Any): void {
            that.eventSink = undefined;
            Log.i(TAG, "onCancel: " + args);
        }
    });
}

// ...
// 使用 EventSink 发送数据后,dart断的事件监听回调会收到发送的数据。
that.eventSink?.success("Success at " + new Date());

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

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

相关文章

【KOA框架】koa框架基础入门

koa是express的一层封装&#xff0c;语法比express更加简洁。所以有必要了解下koa的相关开发方法。 代码实现 package.json {"name": "koapp","version": "1.0.0","main": "index.js","scripts": {&…

我的创作纪念日——我与CSDN一起走过的365天

目录 一、机缘&#xff1a;旅程的开始 二、收获&#xff1a;沿路的花朵 三、日常&#xff1a;不断前行中 四、成就&#xff1a;一点小确幸 五、憧憬&#xff1a;梦中的重点 一、机缘&#xff1a;旅程的开始 最开始开始写博客是在今年一二月份的时候&#xff0c;也就是上一…

DenseNet-密集连接卷积网络

DenseNet&#xff08;Densely Connected Convolutional Network&#xff09;是近年来图像识别领域中一种创新且高效的深度卷积神经网络架构。它通过引入密集连接的设计&#xff0c;极大地提高了特征传递效率&#xff0c;减缓了梯度消失问题&#xff0c;促进了特征重用&#xff…

人形机器人将制造iPhone!

前言 优必选机器人和富士康通过一项突破性的合作伙伴关系&#xff0c;正在将先进的人形机器人&#xff08;如Walker S1及其升级版Walker S2&#xff09;整合到制造流程中&#xff0c;以改变iPhone的生产方式。这一合作旨在通过提升机器人能力、优化工作流程以及实现更智能的自动…

数据结构(链表 哈希表)

在Python中&#xff0c;链表和哈希表都是常见的数据结构&#xff0c;可以用来存储和处理数据。 链表是一种线性数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以用来实现栈、队列以及其他数据结构。Python中可…

[苍穹外卖] 1-项目介绍及环境搭建

项目介绍 定位&#xff1a;专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件产品 功能架构&#xff1a; 管理端 - 外卖商家使用 用户端 - 点餐用户使用 技术栈&#xff1a; 开发环境的搭建 整体结构&#xff1a; 前端环境 前端工程基于 nginx 运行 - Ngi…

vmware虚拟机配置ubuntu 18.04(20.04)静态IP地址

VMware版本 &#xff1a;VMware Workstation 17 Pro ubuntu版本&#xff1a;ubuntu-18.04.4-desktop-amd64 主机环境 win11 1. 修改 VMware虚拟网络编辑器 打开vmware&#xff0c;点击顶部的“编辑"菜单&#xff0c;打开 ”虚拟化网络编辑器“ 。 选择更改设置&#…

AUTOSAR OS模块详解(三) Alarm

AUTOSAR OS模块详解(三) Alarm 本文主要介绍AUTOSAR OS的Alarm&#xff0c;并对基于英飞凌Aurix TC3XX系列芯片的Vector Microsar代码和配置进行部分讲解。 文章目录 AUTOSAR OS模块详解(三) Alarm1 简介2 功能介绍2.1 触发原理2.2 工作类型2.3 Alarm启动方式2.4 Alarm配置2.5…

「免填邀请码」赋能各类APP,提升转化率与用户体验

在当前移动互联网的高速发展下&#xff0c;用户获取和留存已成为各类APP成功的关键。传统的注册流程虽然能够有效识别用户来源并进行用户管理&#xff0c;但随着市场竞争的激烈&#xff0c;复杂的注册和绑定步骤往往会成为用户流失的瓶颈。免填邀请码技术&#xff0c;结合自研的…

Linux:expect spawn简介与用法

一、背景 大家在使用linux系统的很多时候&#xff0c;都用linux指令来实现一些操作&#xff0c;执行特定的job&#xff0c;有时一些场景中需要执行交互指令来完成任务&#xff0c;比如ssh登录这个命令大家一定很熟悉&#xff1a; ssh-keygen -t rsa # 以及 ssh-copy-id -i /hom…

Express的接口

目录 接口的跨域问题域问题 request接口代码 const express require(express) const app express() //在路由之前&#xff0c;配置cors中间件&#xff0c;解决接口跨域问题 const cors require(cors) app.use(cors())const router require(./apiRouter)app.use(/api,rout…

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

文章目录 OverviewPCIe VDM (Vendor Defined Messages) 概述PCIe VDM Header 的各个字段及作用VDM 的工作方式例子:一个简化的 VDM 示例注意事项Overview 本文将详细介绍 PCIe VDM 及 PCIe VDM Header 各个域的作用。 PCIe VDM (Vendor Defined Messages) 概述 在 PCIe 协议…

微服务学习:基础理论

一、微服务和应用现代化 1、时代的浪潮&#xff0c;企业的机遇和挑战 在互联网化数字化智能化全球化的当今社会&#xff0c;IT行业也面临新的挑战&#xff1a; 【快】业务需求如“滔滔江水连绵不绝”&#xff0c;企业需要更快的交付【变】林子大了&#xff0c;百色用户&…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

【PCIe 总线及设备入门学习专栏 6 -- PCIe Inbound and Outbound】

文章目录 PCIe Outbound 和 Inbound 概念详解Outbound 与 Inbound 的基础定义基于角色的详细分析关于“上游”和“下游”方向应用举例小结PCIe Outbound 和 Inbound 概念详解 PCIe(Peripheral Component Interconnect Express)是一种高速串行通信协议,用于连接主机与外部设…

24年总结 -- 共赴心中所向往的未来

一、前言 我又回来了&#xff0c;前阵子忙着期末考试的东西&#xff0c;也是快半个月没更新了&#xff0c;刚好前几天报名了博客之星的评选&#xff0c;也很幸运的入围了&#xff0c;也借此机会来回顾一下关于2024年的个人成长、创作经历等。 二、个人 本人是一个双非学校的软…

嵌入式产品级-超小尺寸热成像相机(从0到1 硬件-软件-外壳)

Thermal_Imaging_Camera This is a small thermal imaging camera that includes everything from hardware and software. 小尺寸热成像相机-Pico-LVGL-RTOS 基于RP2040 Pico主控与RTOS&#xff0c;榨干双核性能实现LVGL和成图任务并行。ST7789驱动240280屏&#xff0c;CST8…

网络协议入门:OSI模型与TCP/IP栈

在网络通信的世界中&#xff0c;数据从一台设备传输到另一台设备&#xff0c;需要遵循一系列规则&#xff0c;这些规则统称为网络协议。OSI模型和TCP/IP协议栈作为网络通信的基石&#xff0c;帮助我们理解数据传输的全流程。这篇文章将深入解析它们的结构、功能和实际应用&…

HackMyVM-Klim靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 CVE-2008-0166 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.159.127) 靶 机&#xff1a;debian(192.168.159.27) 注意事…

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…