• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Flutter通信机制 Dart端

武飞扬头像
小二李
帮助1

Flutter 和 Native 通信场景

学新通

Flutter 和 Native通信机制

Flutter和Native的通信是通过Channel来完成的。
学新通
Flutter定义了三种不同类型的Channel

  • BasicMessageChannel
    用于传递字符串和半结构化的信息,持续通信,收到消息后可以回复此消息,如Native将遍历到的文件信息陆续传递给Dart,Flutter将从服务端获取到的信息交给Native加工,Native处理完返回等。
  • MethodChannel
    用于传递方法调用,一次性通信,如Flutter调用Native拍照
  • EventChannel
    用于数据流的通信,持续通信,收到消息后无法回复此次消息,通过常用于Native向Dart的通信,如手机电量变化、网络连接变化、陀螺仪、传感器信息等

这三种类型的Channel都是全双工通信,Dart可以主动发消息给Native,并且Native接收到消息后可以做出回应,同样,Native可以主动发送消息给Dart,Dart接收到消息后返回给Native端。

BasicMessageChannel 用法

Native端

BasicMessageChannel(@NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec) 
  • BinaryMessenger messenger
    消息信使,是消息的发送与接收工具
  • String name
    Channel名字,唯一标识符
  • MessageCodec<T> codec
    消息的编解码器

Dart端

const BasicMessageChannel(this.name, this.codec, { BinaryMessenger? binaryMessenger })
  • this.name
    Channel的名字,要和Native端保持一致
  • this.codec
    消息的编解码器,要和Native端保持一致

setMessageHandler 方法原型

void setMessageHandler(Future<T> Function(T? message)? handler)
  • Future<T> handler(T message)
    消息处理器,配合BinaryMessager完成消息的处理

在创建好BasicMessageChannel后,如果要让其接收Native发来的消息,则需要调用它的setMessageHandler方法为其设置一个消息处理器。

send 方法原型

Future<T?> send(T message)
  • T message 要传递给Native的具体信息
  • Future<T?> 消息发出去后,收到Native回复的回调函数

在创建好BasicMessageChannel后,如果要向Native发送消息,可以调用它的send方法向Native传递数据。

static const BasicMessageChannel _basicMessageChannel =
      const BasicMessageChannel('channel', StringCodec());

  /// 设置setMessageHandler接收来自Native发来的消息,并回复Native
  void _receiveMessage() {
    _basicMessageChannel.setMessageHandler((message) => Future<String>(() {
          setState(() {
            showMessage = message;
          });
          return "收到Native消息${message}";
        }));
  }

  /// 调用send发送消息
  void _sendMessage(String message) async {
    String response;
    try {
      response = await _basicMessageChannel.send(message);
    } on PlatformException catch (e) {
      print(e);
    }
  }
学新通

MethodChannel 用法

Native端

构造方法原型

MethodChannel(BinaryMessenger messenger, String name) 
MethodChannel(BinaryMessenger messenger, String name, MethodCodec codec)
  • BinaryMessenger messenger
    消息信使,是消息的发送和接收的工具
  • String name
    Channel的名字,也是其唯一标识符
  • MethodCodec codec
    用作 MethodChannel的编解码器

setMethodCallHandler 方法原型

void setMethodCallHandler(final @Nullable MethodCallHandler handler)
  • MethodCallHandler handler
    消息处理器,配合BinaryMessager完成消息的处理

在创建好MethodChannel后,需要调用它的setMethodCallHandler方法为其设置一个消息处理器,以便能接收来自Dart端消息。

MethodChannel.MethodCallHandler 原型

public interface MethodCallHandler {
	void onMethodCall(@NonNull MethodCall call, @NonNull Result result);
 }
  • onMethodCall(@NonNull MethodCall call, @NonNull Result result)
    用于接收消息,call 是消息内容,它有两个成员变量String类型的call.method表示调用的方法名,Object类型的call.arguments表示调用方法所传递的入参,MethodChannel.Result result 是回复此消息的回调函数提供了 result.successresult.errorresult.notImplemented方法调用。

Dart端

构造方法原型

MethodChannel(this.name, [this.codec = const StandardMethodCodec(), BinaryMessenger? binaryMessenger ])
  • this.name
    Channel的名字,要和Native端保持一致
  • this.codec
    消息的编解码器,要和Native端保持一致

invokeMethod 方法原型

void invokeMethod(@NonNull String method, @Nullable Object arguments)
  • String method
    要调用的Native方法名
  • Object arguments
    传递的参数
static const MethodChannel _methodChannel = const MethodChannel('channel');
response = await _methodChannel.invokeMethod('send', 'value');

EventChannel 用法

Native端

构造方法原型

EventChannel(BinaryMessenger messenger, String name)
EventChannel(BinaryMessenger messenger, String name, MethodCodec codec) 
  • BinaryMessenger messenger
    消息信使,是消息发送和接收的工具
  • String name
    Channel的名字,唯一标识
  • MethodCodec codec
    用作EventChannel的编解码器

setStreamHandler 方法原型

void setStreamHandler(final StreamHandler handler)

Dart端

构造方法原型

EventChannel(this.name, [this.codec = const StandardMethodCodec(), BinaryMessenger? binaryMessenger])
  • this.name
    Channel的名字,要和Native端保持一致
  • this.codec
    消息的编解码器,要和Native端保持一致

receiveBroadcastStream 方法原型

Stream<dynamic> receiveBroadcastStream([ dynamic arguments ]) 
  • dynamic arguments
    监听事件向Native传递的数据

初始化一个广播流用于从channel中接收数据,它返回一个Sream,接下来需要调用Stream的listen方法来完成注册,另外在页面销毁时调用Stream的cancel方法来取消监听。

StreamSubscription _streamSubscription;

  @override
  void initState() {
    super.initState();
    _streamSubscription = _eventChannel
        .receiveBroadcastStream()
        .listen(_onToDart, onError: _onToDartError);
  }
  @override
  void dispose() {
    if(_streamSubscription!=null) {
      // 取消消息监听
      _streamSubscription.cancel();
      _streamSubscription = null;
    }
    super.dispose();
  }
  void _onToDart(message) {
    setState(() {
      showMessage = message;
    });
  }

  void _onToDartError(e) {
    print(e);
  }
学新通

参考文章

https://www.jianshu.com/p/af8b337356e2
https://juejin.cn/post/6844903997866786829

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgakhji
系列文章
更多 icon
同类精品
更多 icon
继续加载