Flutter项目和鸿蒙平台的通信

前言

大家在使用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());
### Flutter鸿蒙系统的通信实现方式 Flutter鸿蒙系统之间的通信可以通过多种方式实现,以下是几种常见的方法: #### 1. **平台通道(Platform Channel)** Flutter提供了平台通道机制,用于在Dart代码原生代码之间进行通信鸿蒙系统支持使用Java或C++编写原生模块,因此可以利用Flutter的MethodChannel、EventChannel或BasicMessageChannel实现双向通信[^2]。 - **MethodChannel**:适用于调用原生方法并返回结果。 - **EventChannel**:适用于持续的数据流传输,例如传感器数据。 - **BasicMessageChannel**:适用于简单的消息传递。 示例代码如下: ```dart import 'package:flutter/services.dart'; final platform = MethodChannel('example_channel'); Future<void> sendMessage() async { try { String result = await platform.invokeMethod('sendMessage', {'message': 'Hello HarmonyOS'}); print('Received from HarmonyOS: $result'); } on PlatformException catch (e) { print("Failed to send message: ${e.message}"); } } ``` #### 2. **插件开发** 开发专门针对鸿蒙系统的Flutter插件,封装鸿蒙特有的功能接口,如分布式设备管理、文件共享等。通过插件,开发者可以更方便地调用鸿蒙系统的API[^3]。 #### 3. **分布式数据管理** 鸿蒙系统支持分布式数据管理能力,Flutter应用可以通过鸿蒙提供的分布式数据库API实现跨设备的数据同步通信。这种方式特别适合多设备协同场景[^4]。 #### 4. **Socket通信** 如果需要实现更底层的通信,可以使用Socket技术在Flutter鸿蒙系统之间建立连接。Flutter支持通过`dart:io`库创建TCP/UDP连接,而鸿蒙系统也支持类似的网络通信功能[^5]。 示例代码如下: ```dart import 'dart:io'; void connectToHarmonyOS() { Socket.connect('192.168.1.100', 8080).then((Socket socket) { print('Connected to HarmonyOS'); socket.listen( (data) { print('Data received: ${String.fromCharCodes(data)}'); }, onDone: () => print('Connection closed'), onError: (error) => print('Error: $error'), ); socket.write('Hello HarmonyOS'); }); } ``` #### 5. **HTTP请求** 使用HTTP协议进行通信是一种简单且通用的方式。Flutter可以通过`http`包向鸿蒙系统的后端服务发送请求,获取或提交数据[^6]。 示例代码如下: ```dart import 'package:http/http.dart' as http; Future<void> fetchData() async { final response = await http.get(Uri.parse('http://harmonyos-server/api/data')); if (response.statusCode == 200) { print('Data from HarmonyOS: ${response.body}'); } else { print('Failed to fetch data'); } } ``` #### 6. **共享存储** 在某些场景下,可以通过共享存储(如文件系统或数据库)实现Flutter鸿蒙系统之间的通信。双方读写同一份数据,从而达到信息交换的目的[^7]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值