Flutter与Android通信开发指南

}

@Override

public void onMessage(String s, BasicMessageChannel.Reply reply) {//处理Dart发来的消息

reply.reply(“BasicMessageChannel收到:” + s);//可以通过reply进行回复

if (activity instanceof IShowMessage) {

((IShowMessage) activity).onShowMessage(s);

}

Toast.makeText(activity, s, Toast.LENGTH_SHORT).show();

}

/**

  • 向Dart发送消息,并接受Dart的反馈

  • @param message 要给Dart发送的消息内容

  • @param callback 来自Dart的反馈

*/

void send(String message, BasicMessageChannel.Reply callback) {

messageChannel.send(message, callback);

}

@Override

public void reply(String s) {

}

}

实例源码下载

Dart端:

构造方法原型

const BasicMessageChannel(this.name, this.codec);

  • String name - Channel的名字,要和Native端保持一致;

  • MessageCodec<T> codec - 消息的编解码器,要和Native端保持一致,有四种类型的实现具体可以参考Native端的介绍;

setMessageHandler方法原型

void setMessageHandler(Future handler(T message))

  • Future<T> handler(T message) - 消息处理器,配合BinaryMessenger完成消息的处理;

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

send方法原型

Future send(T message)

  • T message - 要传递给Native的具体信息;

  • Future<T> - 消息发出去后,收到Native回复的回调函数;

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

import ‘package:flutter/services.dart’;

static const BasicMessageChannel _basicMessageChannel =

const BasicMessageChannel(‘BasicMessageChannelPlugin’, StringCodec());

//使用BasicMessageChannel接受来自Native的消息,并向Native回复

_basicMessageChannel

.setMessageHandler((String message) => Future(() {

setState(() {

showMessage = message;

});

return “收到Native的消息:” + message;

}));

//使用BasicMessageChannel向Native发送消息,并接受Native的回复

String response;

try {

response = await _basicMessageChannel.send(value);

} on PlatformException catch (e) {

print(e);

}

实例源码下载

MethodChannel用法

Native端:

构造方法原型

//会构造一个StandardMethodCodec.INSTANCE类型的MethodCodec

MethodChannel(BinaryMessenger messenger, String name)

//或

MethodChannel(BinaryMessenger messenger, String name, MethodCodec codec)

  • BinaryMessenger messenger - 消息信使,是消息的发送与接收的工具;

  • String name - Channel的名字,也是其唯一标识符;

  • MethodCodec codec - 用作MethodChannel的编解码器;

setMethodCallHandler方法原型

setMethodCallHandler(@Nullable MethodChannel.MethodCallHandler handler)

  • @Nullable MethodChannel.MethodCallHandler handler - 消息处理器,配合BinaryMessenger完成消息的处理;

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

MethodChannel.MethodCallHandler原型

public interface MethodCallHandler {

void onMethodCall(MethodCall var1, MethodChannel.Result var2);

}

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

public class MethodChannelPlugin implements MethodCallHandler {

private final Activity activity;

/**

  • Plugin registration.

*/

public static void registerWith(FlutterView flutterView) {

MethodChannel channel = new MethodChannel(flutterView, “MethodChannelPlugin”);

MethodChannelPlugin instance = new MethodChannelPlugin((Activity) flutterView.getContext());

channel.setMethodCallHandler(instance);

}

private MethodChannelPlugin(Activity activity) {

this.activity = activity;

}

@Override

public void onMethodCall(MethodCall call, Result result) {

switch (call.method) {//处理来自Dart的方法调用

case “showMessage”:

showMessage(call.arguments());

result.success(“MethodChannelPlugin收到:” + call.arguments);//返回结果给Dart

break;

default:

result.notImplemented();

}

}

/**

  • 展示来自Dart的数据

  • @param arguments

*/

private void showMessage(String arguments) {

if (activity instanceof IShowMessage) {

((IShowMessage) activity).onShowMessage(arguments);

}

Toast.makeText(activity, arguments, Toast.LENGTH_SHORT).show();

}

}

实例源码下载

Dart端:

构造方法原型

const MethodChannel(this.name, [this.codec = const StandardMethodCodec()])

  • String name - Channel的名字,要和Native端保持一致;

  • MethodCodec codec - 消息的编解码器,默认是StandardMethodCodec,要和Native端保持一致;

invokeMethod方法原型

Future invokeMethod(String method, [ dynamic arguments ])

  • String method:要调用Native的方法名;

  • [ dynamic arguments ]:调用Native方法传递的参数,可不传;

import ‘package:flutter/services.dart’;

static const MethodChannel _methodChannelPlugin =

const MethodChannel(‘MethodChannelPlugin’);

String response;

try {

response = await _methodChannelPlugin.invokeMethod(‘send’, value);

} on PlatformException catch (e) {

print(e);

}

EventChannel用法

Native端:

构造方法原型

//会构造一个StandardMethodCodec.INSTANCE类型的MethodCodec

EventChannel(BinaryMessenger messenger, String name)

//或

EventChannel(BinaryMessenger messenger, String name, MethodCodec codec)

  • BinaryMessenger messenger - 消息信使,是消息的发送与接收的工具;

  • String name - Channel的名字,也是其唯一标识符;

  • MethodCodec codec - 用作EventChannel的编解码器;

setStreamHandler方法原型

void setStreamHandler(EventChannel.StreamHandler handler)

EventChannel.StreamHandler handler - 消息处理器,配合BinaryMessenger完成消息的处理;

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

EventChannel.StreamHandler原型

public interface StreamHandler {

void onListen(Object args, EventChannel.EventSink eventSink);

void onCancel(Object o);

}

  • void onListen(Object args, EventChannel.EventSink eventSink) - Flutter Native监听事件时调用,Object args是传递的参数,EventChannel.EventSink eventSink是Native回调Dart时的会回调函数,eventSink提供successerrorendOfStream三个回调方法分别对应事件的不同状态;

  • void onCancel(Object o) - Flutter取消监听时调用;

public class EventChannelPlugin implements EventChannel.StreamHandler {

private List<EventChannel.EventSink> eventSinks = new ArrayList<>();

static EventChannelPlugin registerWith(FlutterView flutterView) {

EventChannelPlugin plugin = new EventChannelPlugin();

new EventChannel(flutterView, “EventChannelPlugin”).setStreamHandler(plugin);

return plugin;

}

void sendEvent(Object params) {

for (EventChannel.EventSink eventSink : eventSinks) {

eventSink.success(params);

}

}

@Override

public void onListen(Object args, EventChannel.EventSink eventSink) {

eventSinks.add(eventSink);

}

@Override

public void onCancel(Object o) {

}

}

实例源码下载

Dart端:

构造方法原型

const EventChannel(this.name, [this.codec = const StandardMethodCodec()]);

  • String name - Channel的名字,要和Native端保持一致;

  • MethodCodec codec - 消息的编解码器,默认是StandardMethodCodec,要和Native端保持一致;

receiveBroadcastStream方法原型

Stream receiveBroadcastStream([ dynamic arguments ])

  • dynamic arguments - 监听事件时向Native传递的数据;

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

import ‘package:flutter/services.dart’;

static const EventChannel _eventChannelPlugin =

EventChannel(‘EventChannelPlugin’);

StreamSubscription _streamSubscription;

@override

void initState() {

_streamSubscription=_eventChannelPlugin

.receiveBroadcastStream()

.listen(_onToDart, onError: _onToDartError);

super.initState();

}

@override

void dispose() {

if (_streamSubscription != null) {

_streamSubscription.cancel();

_streamSubscription = null;

}

super.dispose();

}

void _onToDart(message) {

setState(() {

showMessage = message;

});

}

void _onToDartError(error) {

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值