Flutter与Android通信方式->BasicMessageChannel方式(发送消息并且返回结果)
摘要:Flutter版本号:1.12.13,Kotlin版本号:1.3.72
版本号不同,实现的方式不一样,所以特此标注下。
具体的实现原理,自行查阅。这里只写代码实现过程,主要原因是网上Kotlin的实现方式实在太少,特此记录。
Flutter:
import 'package:base_library/base_library.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class ChannelDemoPage extends StatefulWidget { @override _ChannelDemoPageState createState() => _ChannelDemoPageState(); } class _ChannelDemoPageState extends State<ChannelDemoPage> { static const _channel = const MethodChannel('plugins.flutter.io/FlutterMessagePlugin'); static const eventChannel = EventChannel('plugins.flutter.io/FlutterEventPlugin'); static const _basicMessageChannel = BasicMessageChannel( 'plugins.flutter.io/FlutterBasicMessageChannel', StringCodec()); @override void initState() { super.initState(); eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError); // ignore: missing_return _basicMessageChannel.setMessageHandler((String message) { LogUtil.e("Flutter收到Android发来Basic消息->, $message"); }); } void _onEvent(Object event) { LogUtil.e("Flutter收到Android发来的消息-> " + event.toString()); } void _onError(Object error) { LogUtil.e("错误:" + error.toString()); } @override Widget build(BuildContext context) { return new Scaffold( body: new Row(), floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, floatingActionButton: new FloatingActionButton( backgroundColor: Colors.blueAccent, onPressed: () { this.getResult(); }, child: new Icon(Icons.adb), ), ); } void getResult() async { try { Map<String, Object> map = {"shareUrl": "https://www.baidu.com"}; var result = await _channel.invokeMethod("getRealUrl", map); LogUtil.e("result->$result"); } catch (e) { LogUtil.e("e->, $e"); } } }
Kotlin:
import android.content.Context import android.util.Log import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.BasicMessageChannel import io.flutter.plugin.common.BasicMessageChannel.MessageHandler import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.StringCodec class FlutterBasicMessageChannel : FlutterPlugin, MessageHandler<String> { private var channelName = "plugins.flutter.io/FlutterBasicMessageChannel" private var context: Context? = null companion object { private var basicMessageChannel: BasicMessageChannel<String>? = null fun sendContent(content: String) { basicMessageChannel?.send(content) } } override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { basicMessageChannel = BasicMessageChannel(binding.binaryMessenger, channelName, StringCodec.INSTANCE) basicMessageChannel?.setMessageHandler(this) context = binding.applicationContext } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { basicMessageChannel?.setMessageHandler(null) basicMessageChannel = null; } override fun onMessage(message: String?, reply: BasicMessageChannel.Reply<String>) { Log.i("Android", "Received message = $message") reply.reply("Reply from Android") } }
import androidx.annotation.NonNull; import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity: FlutterActivity () { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { flutterEngine.getPlugins().add(FlutterMessagePlugin()); flutterEngine.getPlugins().add(FlutterEventPlugin()); flutterEngine.getPlugins().add(FlutterBasicMessageChannel()); GeneratedPluginRegistrant.registerWith(flutterEngine); } }
显示结果:
I/flutter (19721): common_utils e result->处理完成 I/flutter (19721): common_utils e Flutter收到Android发来的消息-> Android发送消息到Flutter I/flutter (19721): common_utils e Flutter收到Android发来Basic消息->, Android发送Basic消息到Flutter

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Flutter与Android通信方式->EventChannel方式(单项通信,不返回结果)
摘要:Flutter版本号:1.12.13,Kotlin版本号:1.3.72 版本号不同,实现的方式不一样,所以特此标注下。 具体的实现原理,自行查阅。这里只写代码实现过程,主要原因是网上Kotlin的实现方式实在太少,特此记录。 Flutter: import 'package:base_library/base_library.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class ChannelDemoPage extends StatefulWidget { @override _ChannelDemoPageState createState() => _ChannelDemoPageState(); } class _ChannelDemoPageState extends State<ChannelDemoPage> { static const _channel = const MethodChan...
- 下一篇
遍地至联云IPFS Filecoin挖矿机构,如何选择有门道!
最近至联云IPFS与Filecoin成为业内热词,除了探讨技术发展前景如何,大多数的人还比较关心Filecoin挖矿。怎么挖矿?选择什么样的机构参与Filecoin挖矿?成为目前普通投资者最关心的问题。那么,如何选择挖矿机构来参与Filecoin挖矿? 首先,我们给挖矿机构做一下类别:第一个级别就是入门级的机构,第二个级别是优秀的机构,第三个是能够引领行业的机构。 先来说一说什么是入门级的挖矿机构。这种机构有一定的技术人员,但是在技术上也仅限于能够看懂代码,了解游戏的规则。然而,这类机构没有核心的竞争力,没有自己研发的硬件或软件。硬件全靠服务商、供货商,软件全靠协议实验室。这种小的挖矿机构在测试网第一阶段就能看得出来,接入Filecoin测试网都要好几天,也需要好几天才能上榜,但并不一定能跑到前面。那么,选择这样的挖矿机构,风险就不是收益有多少的问题了,最主要的是能不能保证挖到Filecoin。 接下来说的是优秀的挖矿机构,这种机构往往参与Filecoin项目比较早,对于IPFS和Filecoin都有一定的理解。甚至有些机构参与过Filecoin源代码的贡献,在测试网中往往能够快速的上...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装