Flutter 与原生交互

Flutter 与原生交互

一.信息传递方面

1.通过dart的Channel进行通信

平台通道的作用是在 Flutter 和设备之间传递消息,如下所示:

在这里插入图片描述

Flutter 中平台特定的 API 支持并不依赖于代码生成,而是依赖于灵活的消息传递方式:

应用程序的 Flutter 部分通过平台通道(Platform Channel)将消息发送到该应用程序的设备平台(Android 或 iOS)
设备平台通过对平台通道的监听接收到消息之后,调用设备平台上对应的 API(使用设备平台原生开发语言),然后将响应数据发送回应用程序的 Flutter 部分

1).平台通道类型

Flutter 中定义了三种不同类型的平台通道

  • BasicMessageChannel:用于传递字符串和半结构化的消息

  • MethodChannel 和 OptionalMethodChannel:用于传递方法调用

  • EventChannel:用于传递数据流

上述三种类型的平台通道相互独立,都有着各自的用途。从源码的角度来说,每个平台通道都有三个非常重要的成员变量:

name: String 类型,表示平台通道的名称,也是通道的唯一标识符

BinaryMessenger: BinaryMessenger 类型,用于表示消息,是接收和发送消息的具体实现

codec: MessageCodec 或者 MethodCodec 类型,是消息的编解码器

name

name 属性是平台通道的唯一标识符。一个 Flutter 应用中可能会存在多个平台通道,每一个平台通道在创建时必须指定一个位移的 name 属性(Flutter 使用该属性来区分每一个通道)。

当有消息从 Flutter 端发送到设备平台时,会根据其传递过来的 name 属性找到该通道对应的 Handler(消息处理器)。

BinaryMessenger

上述三种类型的平台通道都是通过 BinaryMessenger 达到与 Flutter 通信的目的的:
在这里插入图片描述
BinaryMessenger 使用的消息数据格式为二进制格式的数据。当我们初始化一个通道并向该通道注册消息处理器(Handler)时,实际上会生成一个与之对应的 BinaryMessageHandler,并以通道的唯一标示符(name)作为 key 存储到 Map<String, _MessageHandler> _handlers (定义在 platform_messages.dart/BinaryMessages 中)对象中。当我们需要使用 BinaryMessenger 发送消息时,会根据 name 属性查找对应的 BinaryMessageHandler,然后完成消息的发送。

BinaryMessages 在 Android 端是一个接口,其具体实现是 FlutterNativeView。在 iOS 端是一个协议,其名称为 FlutterBinaryMessenger,FlutterViewController 遵循了它。

由于平台通道从 BinaryMessengerHandler 接收到的消息是二进制格式的,需要使用 codec 将消息解码为可识别的数据并传递给 Handler 进行处理。

当 Handler 处理完消息之后,会通过回调方法返回 result,并将 result 通过 codec 编码为二进制数据,最终通过 BinaryMessenger 发送回 Flutter。

2).MethodChannel,EventChannel,BasicMessageChannel通信示例

MethodChannel 通信示例:

flutter端调用平台端系统电量方法

flutter端方法调用

iOS端调用系统电量实现

iOS端调用系统电量实现

Android端调用系统电量实现

Android端调用系统电量实现

EventChannel通信示例:

flutter端接收平台端系统电量方法

flutter端接收平台端系统电量方法

iOS端调用系统电量实现

iOS端调用系统电量实现

Android端调用系统电量实现

Android端调用系统电量实现

BasicMessageChannel通信示例:

flutter端接收平台端系统电量方法

flutter端接收平台端系统电量方法

iOS端发送方法

iOS端发送方法

Android端发送方法

Android端发送方法

遇到问题:需要dart,iOS,Android共同维护代码,代码重复率高,时间成本高。
iOS端最开始尝试解决方案,通过方法及参数,把字符串动态生成实例方法。比之前的代码强一点,但是还没有达到理想程度。

如何解决只只需在dart,iOS,Android三端维护一份代码,达到通信的需求呢?<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter与Android的交互可以通过平台通道(platform channel)来实现。平台通道允许Flutter应用程序与原生Android代码之间进行双向通信。 以下是使用平台通道进行Flutter与Android交互的一般步骤: 1. 在Flutter应用程序中,使用`flutter create`命令创建一个新的Flutter项目,或者在现有项目中添加一个新的Android模块。 2. 在Flutter应用程序中创建一个`MethodChannel`对象,该对象用于在Flutter和Android之间进行方法调用通信。例如,在Dart代码中添加以下代码: ```dart import 'package:flutter/services.dart'; // 创建 MethodChannel 对象 MethodChannel channel = MethodChannel('com.example.channelName'); // 在需要的地方调用原生 Android 方法 Future<void> callNativeMethod() async { try { final String result = await channel.invokeMethod('methodName'); print(result); } catch (e) { print('Error: $e'); } } ``` 3. 在Android项目中,创建一个类来处理来自Flutter应用程序的方法调用。例如,在Java代码中添加以下代码: ```java import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; public class MainActivity extends FlutterActivity { private static final String CHANNEL = "com.example.channelName"; @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); // 注册方法调用处理器 new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) .setMethodCallHandler(new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("methodName")) { // 处理来自Flutter的方法调用 String response = someNativeMethod(); result.success(response); } else { result.notImplemented(); } } }); } // 原生 Android 方法的实现 private String someNativeMethod() { // 实现自己的逻辑 return "Response from Android"; } } ``` 在上述代码中,我们首先定义了一个与Flutter应用程序通信的通道名称(CHANNEL),然后注册了一个方法调用处理器。当Flutter应用程序调用`methodName`方法时,处理器将调用`someNativeMethod`方法并返回响应。 4. 最后,您可以在Flutter应用程序中调用`callNativeMethod`方法,这将触发与Android的交互,并返回来自Android的响应。 请注意,上述代码只是示例,并且可以根据您的需求进行修改和扩展。此外,您还可以使用平台通道传递参数和接收回调,以实现更复杂的交互逻辑。 这是使用平台通道在Flutter和Android之间进行基本交互的基本步骤。希望对您有所帮助!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值