博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter 与原生交互总结
阅读量:2453 次
发布时间:2019-05-10

本文共 4204 字,大约阅读时间需要 14 分钟。

Flutter学习诀窍,Flutter一切皆组件!

Android与Flutter之间的通信共有四种实现方式。

  • 由于在初始化flutter页面时会传递一个字符串——route,因此我们就可以拿route来做文章,传递自己想要传递的数据。该种方式仅支持单向数据传递且数据类型只能为字符串,无返回值。
  • 通过EventChannel来实现,EventChannel仅支持数据单向传递,无返回值。
  • 通过MethodChannel来实现,MethodChannel支持数据双向传递,有返回值。
  • 通过BasicMessageChannel来实现,BasicMessageChannel支持数据双向传递,有返回值。

一、先看下初始化的方式

FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route");

route就是默认的路由字段,这个字段可以是一个JSON对象,这样就可以实现原生传递给Flutter数据,Flutter在自己的路由中心解析这个JSON对象,获取到需要的数据进行处理,初始化页面就ok了。

二、EventChannel

原生传递给Flutter数据,这个方式可以避免一中的在路由里面处理数据,Android代码如下:

new EventChannel(flutterView, CHANNEL_POST).setStreamHandler(new EventChannel.StreamHandler() {
@Override public void onListen(Object o, EventChannel.EventSink eventSink) {
eventSink.success("原生传递参数"); } @Override public void onCancel(Object o) {
} });

其中的CHANNEL_POST,是自己定义的一个协议,和Flutter侧统一就可以,在main.dart中注册该方法就可以,示例代码如下:

Application.eventChannel = const EventChannel(TTKeys.channel_native_post);

参数的获取在路由到的页面中实现,如下所示:

String naviTitle = '商品详情';  // 回调事件  void _onEvent(Object event) {
setState(() {
naviTitle = event.toString(); }); } // 错误返回 void _onError(Object error) {
}

三、MethodChannel

该方式可以实现双向通道,Flutter调用原生,原生再返回数据给Flutter,注册的方式和EventChannel类似,Android端的代码如下:

MethodChannel channelGet = new MethodChannel(flutterView, CHANNEL_GET);        channelGet.setMethodCallHandler((call, result) -> {
result.success(authHeader()); switch (call.method) {
case "router": String args = (String) call.arguments; result.success("回传给Flutter的参数"); break; default: break; } });

Flutter端使用一下的方法获取Android回传的数据:

Application.methodChannel.invokeMethod("router")

这里的路由字段可以自由定义,能区分开就好。

四、BasicMessageChannel

BasicMessageChannel是一种能够在native与flutter之间互相发送消息的通信方式,它支持数据类型最多,使用范围最广。EventChannel与MethodChannel的应用场景可以使用BasicMessageChannel来实现,但BasicMessageChannel的应用场景就不一定能够使用EventChannel与MethodChannel来实现。该方式有返回值。

Android端代码如下:

public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler
{
private Activity activity; private BasicMessageChannel
messageChannel; static BasicMessageChannelPlugin registerWith(FlutterView flutterView) {
return new BasicMessageChannelPlugin(flutterView); } private BasicMessageChannelPlugin(FlutterView flutterView) {
this.activity = (Activity) flutterView.getContext(); this.messageChannel = new BasicMessageChannel
(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE); messageChannel.setMessageHandler(this); } @Override public void onMessage(String s, BasicMessageChannel.Reply
reply) {
reply.reply("BasicMessageChannelPlugin收到:" + s); if (activity instanceof FlutterAppActivity) {
((FlutterAppActivity) activity).showContent(s); } } void send(String str, BasicMessageChannel.Reply
reply) {
messageChannel.send(str, reply); }}

Flutter端的代码如下:

class _MyHomePageState extends State
{
//StringCodec()为编码格式 BasicMessageChannel
_basicMessageChannel = BasicMessageChannel("BasicMessageChannelPlugin", StringCodec()); @override void initState() {
_basicMessageChannel.setMessageHandler((message) => Future
(() {
print(message); //message为native传递的数据 setState(() {
_content = message; }); //给Android端的返回值 return "收到Native消息:" + message; })); _controller = TextEditingController(); super.initState(); } //向native发送消息 void _sendToNative() {
Future
future = _basicMessageChannel.send(_controller.text); future.then((message) {
_resultContent = "返回值:" + message; }); } @override Widget build(BuildContext context) {
...}}

原生与Flutter数据交互,主要就是构建好通道机制,可以多尝试不同的数据传递,构建拓展性比较高的路由中心。

感谢阅读~

Android开发资料+面试架构资料 免费分享 点击链接 即可领取

转载地址:http://fnjhb.baihongyu.com/

你可能感兴趣的文章
flake8变量未使用_使用flake8确保Python代码的一致性
查看>>
ssh与gpg区别_如何使用GPG密钥启用SSH访问进行身份验证
查看>>
apm 韩国开源项目_韩国的开源状态
查看>>
mac上将视频变小_在Mac上将Python 3设置为默认的正确和错误方法
查看>>
java jnlp_Java SE 11删除JNLP的更好解决方案
查看>>
devops 中台_DevOps中的门控生产
查看>>
keil 开源替代_您需要替代开源的哪些专有工具?
查看>>
总论点和分论点_将破坏性的论点变成富有成效的对话
查看>>
pythonic_使用Pythonic在Python中以图形方式编程
查看>>
python black_格式化Python,但您喜欢使用Black
查看>>
如何在Mac上为Python设置虚拟环境
查看>>
使用Python在GitHub Pages上运行博客
查看>>
如何使用Python和Apache Spark分析日志数据
查看>>
移动端仿钉钉聊天 git_使用Git作为聊天的后端
查看>>
raspberry pi_PiFlash入门:在Linux上启动Raspberry Pi
查看>>
固态硬盘损坏数据如何挽救_开放数据和工具如何在灾难期间挽救生命
查看>>
raspberry_您最老的Raspberry Pi多大了?
查看>>
vscode构建rust_使用rust-vmm构建未来的虚拟化堆栈
查看>>
joplin_介绍Joplin,这是Evernote的开源替代方案
查看>>
使用Pygame模块使用Python构建游戏框架
查看>>