一篇看懂Android与Flutter之间的通信,开发人员必学

MyApp({Key key, @required this.initParams}) : super(key: key);

@override
Widget build(BuildContext context) {…}
}

通过该种方式就可以在初始化flutter时,Android给flutter传递数据。由于runApp仅会调用一次,所以该种方式只能传递一次数据且数据只能是字符串。

使用window的相关API需要导入包dart:ui

3.2、EventChannel

EventChannel是一种native向flutter发送数据的单向通信方式,flutter无法返回任何数据给native。主要用于native向flutter发送手机电量变化、网络连接变化、陀螺仪、传感器等。它的使用方式如下。

首先来看Android代码。

public class EventChannelPlugin implements EventChannel.StreamHandler {

private static final String TAG = EventChannelPlugin.class.getSimpleName();
private EventChannel.EventSink eventSink;
private Activity activity;

static EventChannelPlugin registerWith(FlutterView flutterView) {
EventChannelPlugin plugin = new EventChannelPlugin(flutterView);
new EventChannel(flutterView, “EventChannelPlugin”).setStreamHandler(plugin);
return plugin;

}

private EventChannelPlugin(FlutterView flutterView) {
this.activity = (Activity) flutterView.getContext();
}

void send(Object params) {
if (eventSink != null) {
eventSink.success(params);
}
}

void sendError(String str1, String str2, Object params) {
if (eventSink != null) {
eventSink.error(str1, str2, params);
}
}

void cancel() {
if (eventSink != null) {
eventSink.endOfStream();
}
}
//第一个参数为flutter初始化EventChannel时返回的值,仅此一次
@Override
public void onListen(Object o, EventChannel.EventSink eventSink) {
this.eventSink = eventSink;
Log.i(TAG, “eventSink:” + eventSink);
Log.i(TAG, “Object:” + o.toString());
Toast.makeText(activity, “onListen——obj:” + o, Toast.LENGTH_SHORT).show();
}

@Override
public void onCancel(Object o) {
Log.i(TAG, “onCancel:” + o.toString());
Toast.makeText(activity, “onCancel——obj:” + o, Toast.LENGTH_SHORT).show();
this.eventSink = null;
}
}

笔者对Android端代码做了一个简单的封装,还是很好理解的。下面就来看flutter代码实现。

class _MyHomePageState extends State {
EventChannel _eventChannelPlugin = EventChannel(“EventChannelPlugin”);
StreamSubscription _streamSubscription;
@override
void initState() {
_streamSubscription = _eventChannelPlugin
//[“abc”, 123, “你好”]对应着Android端onListen方法的第一个参数,可不传值
.receiveBroadcastStream([“abc”, 123, “你好”])
.listen(_onToDart, onError: _onToDartError, onDone: _onDone);
super.initState();
}

@override
void dispose() {
if (_streamSubscription != null) {
_streamSubscription.cancel();
_streamSubscription = null;
}
super.dispose();
}
//native端发送正常数据
void _onToDart(message) {
print(message);
}
//当native出错时,发送的数据
void _onToDartError(error) {
print(error);
}
//当native发送数据完成时调用的方法,每一次发送完成就会调用
void _onDone() {
print(“消息传递完毕”);
}

@override
Widget build(BuildContext context) {…}
}

上面就是通过EventChannel来进行通信的代码实现,调用EventChannelPluginsend方法就能给flutter发送数据。

3.3、MethodChannel

MethodChannel是一种native与flutter之间互相发送数据的通信方式,顾名思义,通过MethodChannel就能调用native与flutter中相对应的方法,该种方式有返回值。它的使用方式如下。

首先来看Android端的代码实现。

public class MethodChannelPlugin implements MethodChannel.MethodCallHandler {

private Activity activity;
private MethodChannel channel;

public static MethodChannelPlugin registerWith(FlutterView flutterView) {
MethodChannel channel = new MethodChannel(flutterView, “MethodChannelPlugin”);
MethodChannelPlugin methodChannelPlugin = new MethodChannelPlugin((Activity) flutterView.getContext(), channel);
channel.setMethodCallHandler(methodChannelPlugin);
return methodChannelPlugin;
}

private MethodChannelPlugin(Activity activity, MethodChannel channel) {
this.activity = activity;
this.channel = channel;

}
//调用flutter端方法,无返回值
public void invokeMethod(String method, Object o) {
channel.invokeMethod(method, o);
}
//调用flutter端方法,有返回值
public void invokeMethod(String method, Object o, MethodChannel.Result result) {
channel.invokeMethod(method, o, result);
}

@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
switch (methodCall.method) {
case “send”😕/返回的方法名
//给flutter端的返回值
result.success(“MethodChannelPlugin收到:” + methodCall.arguments);
Toast.makeText(activity, methodCall.arguments + “”, Toast.LENGTH_SHORT).show();
if (activity instanceof FlutterAppActivity) {
((FlutterAppActivity) activity).showContent(methodCall.arguments);
}
break;
default:
result.notImplemented();
break;
}
}
}

笔者对Android端代码做了一个简单的封装,还是很好理解的。下面就来看flutter代码实现。

class _MyHomePageState extends State {
MethodChannel _methodChannel = MethodChannel(“MethodChannelPlugin”);
@override
void initState() {
_methodChannel.setMethodCallHandler((handler) => Future(() {
print(“_methodChannel:${handler}”);
//监听native发送的方法名及参数
switch (handler.method) {
case “send”:
_send(handler.arguments);//handler.arguments表示native传递的方法参数
break;
}
}));
super.initState();
}
//native调用的flutter方法
void _send(arg) {
setState(() {
_content = arg;
});
}
String _resultContent = “”;

//flutter调用native的相应方法
void _sendToNative() {
Future future =
_methodChannel.invokeMethod(“send”, _controller.text);
future.then((message) {
setState(() {
//message是native返回的数据
_resultContent = “返回值:” + message;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

**其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。

像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

这么重要的事情说三遍啦!点赞+点赞+点赞 免费分享所有学习秘籍!
直达领取链接:点击链接免费领取【Android高级架构师

【Android高级架构师系统学习资料】高级架构师进阶必备——设计思想解读开源框架

第一章、热修复设计
第二章、插件化框架设计
第三章、组件化框架设计
第四章、图片加载框架
第五章、网络访问框架设计
第六章、RXJava 响应式编程框架设计
第七章、IOC 架构设计
第八章、Android 架构组件 Jetpack

s/618156601)】**
[外链图片转存中…(img-QgA1oEgY-1711076784309)]

【Android高级架构师系统学习资料】高级架构师进阶必备——设计思想解读开源框架

第一章、热修复设计
第二章、插件化框架设计
第三章、组件化框架设计
第四章、图片加载框架
第五章、网络访问框架设计
第六章、RXJava 响应式编程框架设计
第七章、IOC 架构设计
第八章、Android 架构组件 Jetpack

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值