android 与 flutter 之间的通信

文章目录

  • 前言
  • 集成 flutter 混合开发
  • android 与 flutter 之间的通信
  • 总结
一、前言

因为flutter 具有跨平台的属性,既可以在android上跑,也能在ios 上跑,所以为了节约开发的成本,减少人力,势必就会用到它。然而已有的项目部不太可能重新写,所以就需要进行混合开发。也就是在原生中集成flutter,进行混合开发。混合开发就会遇到原生和flutter的通信问题,今个就讲讲原生和flutter的通信。

二、首先创建个flutter module,然后集成到app中

1、在原生项目的父目录下,使用命令,创建flutter项目:
flutter create -t module --org com.example flutter_demo
在这里插入图片描述
创建完毕,然后我们用as打开这个父目录,可以看到我们的flutter_demo 已经创建好了,如图:
在这里插入图片描述
2、在原生app里面的settings.gradle,include ‘:app’ 下面添加:

setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir.parentFile,'flutter_demo/.android/include_flutter.groovy'
))
include ':flutter_demo'

3、在原生app下的build.gradle中添加依赖:

dependencies {//...implementation project(':flutter')
}

添加完毕,我们切回 app的项目,运行会发现报错了。
在这里插入图片描述
报错是说flutterPlugin 没法用,这里在settings.gradle 将repositoriesMode改为:RepositoriesMode.PREFER_PROJECT。重新运行。
如果还遇到第三方解析失败,添加maven:

dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)repositories {maven { url 'https://jitpack.io' }maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }maven { url 'https://maven.aliyun.com/repository/central' }maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }google()mavenCentral()}
}

另外在项目的build.gradel 添加:

allprojects {repositories {maven { url 'https://jitpack.io' }maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }maven { url 'https://maven.aliyun.com/repository/central' }maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }google()mavenCentral()}
}

然后运行app,就可以了。如果你还有其他报错,切换到根目录,去检查下flutter_demo里头的这两个文件。打开main.dart,提示你Enable Dart support,点击它就可以。然后再打开 pubspec.yaml ,点击pub get 获取相应的依赖。确保flutter项目的环境和依赖库没问题。

到这里,我们的flutter_demo 就集成到我们的app中了。接下来就是看android和flutter的通信

三、android和flutter的通信

上面的项目,每次要看flutter代码是不是每次都要切过来切过去的,所以呢,我们可以在setting.gradle 加上这么一行代码:
project(‘:flutter_demo’).projectDir = new File(‘…/flutter_demo’)
在这里插入图片描述
这样,我们在app的项目中就能查看flutter的代码了。好了,我们最想知道的就是android 怎么打开 flutter页面。接这往下看。

1、android 跳转 flutter:
在清单AndroidManifest里面添加 FlutterActivity

    <activity android:name="io.flutter.embedding.android.FlutterActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"></activity>

点击跳转:

   binding.fab.setOnClickListener { view ->//跳转flutterstartActivity(FlutterActivity.createDefaultIntent(this))}

你会发现跳转很慢,所以,我们用带有缓存引擎的初始路由来启动FlutterActivity
创建一个MyApplication 然后 在onCreate 中进行缓存引擎的初始化。

    // 创建一个Flutter引擎flutterEngine = new FlutterEngine(this);// 开始执行 Dart 代码来预热flutter引擎flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());//缓存Flutter引擎用来开启FlutterActivityFlutterEngineCache.getInstance().put("my_engine_id", flutterEngine);}

这个我们就能使用缓存引擎跳转Flutter。

 binding.fab.setOnClickListener { view ->//跳转flutterstartActivity(FlutterActivity.withCachedEngine("my_engine_id").build(this));}

很明显立马就跳转过去了。

2、如何跳转不同的flutter页面?
在applation 的onCreate 初始化需要跳转的页面, 到我们的Application 中的onCreate添加:

flutterEngine.getNavigationChannel().setInitialRoute("/test2");

然后修改main.dart 的代码:

void main() => runApp(_widgetForRoute(window.defaultRouteName));Widget _widgetForRoute(String route) {
switch (route) {case '/test1':return const Test1();case '/test2':return const Test2();case '/test3':return const Test3();default:return const Test1();
}
}

Test1是Test1.dart,代表不同的页面。当我们要跳转不同的页面,只要修改
flutterEngine.getNavigationChannel().setInitialRoute(“/test2”);就可以了,比如我们要跳转到Test3页面改成 flutterEngine.getNavigationChannel().setInitialRoute(“/test3”);
这个很简单,根据不同的标识,跳转对应的页面就行了。

四、接下来,就是文章的主题,讲通信方式都有哪些?

BasicMsgChannel
EventChannel
MethodChannel

1、BasicMsgChannel 方式
双向的,原生可以给flutter发送,然后flutter同时也可以返回信息给原生

发送:

    val flutterEngine = MyApplication.flutterEngineval basicMessageChannel = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger,"basicMessageChannel",StringCodec.INSTANCE)basicMessageChannel.send("通过basicMessageChannel发送消息"){message: String?->Log.d("ssz", "接收:$message") //message 是flutter发回给原生的消息}

flutter 接收:

_basicMessageChannel = const BasicMessageChannel('basicMessageChannel', StringCodec());_basicMessageChannel.setMessageHandler((String? message) => Future<String>((){setState(() {//刷新控件_basicMessage = "flutter接收了消息:${message!}";});return "flutter 收到了";//这里是返回信息给原生}));

我们也可以反过来,原生接收,flutter发送,如下:
原生接收:

    basicMessageChannel.setMessageHandler { message, reply ->Log.d("ssz", "接收:$message")}

flutter 发送:

      _basicMessageChannel.send("我是flutter的消息");

2、MethodChannel 方法
主要是flutter 调用原生

原生接收:

val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "test2")binding.btnTest2.setOnClickListener {toFlutter()methodChannel.setMethodCallHandler { call, result ->if (call.method.equals("open")){Log.d("ssz", "接收flutter调用")}}}

flutter 发送

 const _methodChannel = MethodChannel('test2');_methodChannel.invokeListMethod("open");

3、EventChannel方法
主要是原生发送给flutter,这个方法使用不当就会接受不到,谨慎使用。

原生发送:

 val eventChannel = EventChannel(MyApplication.flutterEngine.dartExecutor.binaryMessenger, "test3")binding.btnTest3.setOnClickListener {toFlutter()eventChannel.setStreamHandler(object : StreamHandler{override fun onListen(arguments: Any?, events: EventSink?) {Log.d("ssz","执行了 onListen");events?.success("原生发送")}override fun onCancel(arguments: Any?) {}})}}

flutter 接收

void initState() {super.initState();Future.delayed(const Duration(milliseconds: 6000), () {//需要做个延迟,不然原生onListen会不执行,导致不能发送消息var eventChannel = const EventChannel("test3");eventChannel.receiveBroadcastStream().listen((dynamic event) {setState(() {_EventMessage = "flutter接收$event";});}, onError: (dynamic error){setState(() {_EventMessage = "flutter接收$error";});},cancelOnError: true);});}

最后呢,关于路由方面,有的业务可能需要跳转很多不同的页面,原生的方式不太友好,可以选择闲鱼开源的库 https://github.com/alibaba/flutter_boost ,提高开发的效率。

以上代码地址:https://github.com/shenshizhong/HybridFlutter

总结

总的来讲:
1、android集成flutter,进行混合开发
2、android 与 flutter 的通信
3、使用第三方提高开发效率

如果对你有一点点帮助,那是值得高兴的事情。:)
我的csdn:http://blog.csdn.net/shenshizhong
我的简书:http://www.jianshu.com/u/345daf0211ad

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/156955.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04在命令行中使用Maven命令创建Maven版的Web工程,并将工程部署到服务器的步骤

创建Maven版的Web工程 使用命令生成Web工程 使用mvn archetype:generate命令生成Web工程时&#xff0c;需要使用一个专门生成Web工程骨架的archetype(参照官网看到它的用法) -D表示后面要附加命令的参数&#xff0c;字母D和后面的参数是紧挨着的&#xff0c;中间没有任何其它…

Ceph介绍与部署

Ceph介绍与部署 一、存储基础1.1、单机存储设备1.1.1、单机存储的问题 1.2、商业存储解决方案1.3、分布式存储&#xff08;软件定义的存储 SDS&#xff09;1.3.1、分布式存储的类型 二、Ceph 简介三、Ceph 优势四、Ceph 架构五、Ceph 核心组件5.1、Pool中数据保存方式支持两种类…

FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心

FlashDuty&#xff1a;一站式告警响应平台&#xff0c;前往此地址免费体验&#xff01; 自定义字段 FlashDuty 已支持接入大部分常见的告警系统&#xff0c;我们将推送内容中的大部分信息放到了 Lables 进行展示。尽管如此&#xff0c;我们用户还是会有一些扩展或定制性的需求…

数据可视化

pip install matplotlib 一、各种图 #线形图 import numpy as np import pandas as pd df1pd.DataFrame(datanp.random.randn(1000,4),indexpd.date_range(start10/10/2023,periods1000),columnslist(ABCD)) df1.cumsum().plot()#2、条形图 df2pd.DataFrame(datanp.random.ra…

文本编辑器去除PDF水印

用文本编辑器打开pdf&#xff0c;搜索水印的特殊文字&#xff0c;全部替换。 另外一个水印字母间有空格。 替换完后保存。 重新打开pdf&#xff1a;

通常用哪些软件做数据可视化大屏?

数据可视化大屏是一种展示数据的方式&#xff0c;通过使用软件工具可以将数据以图表、地图、仪表盘等形式直观地呈现给用户。以下是常用的数据可视化大屏软件及其特点&#xff1a; 1. Datainside&#xff1a; - 特点&#xff1a;Datainside是一款功能强大且易于使用的数据可视…

绘制X-Bar-S和X-Bar-R图,监测过程,计算CPK过程能力指数

X-Bar-S图和X-Bar-R图是统计质量控制中常用的两种控制图&#xff0c;用于监测过程的稳定性和一致性。它们的主要区别在于如何计算和呈现数据的变化以及所关注的问题类型。 X-Bar-S图&#xff08;平均值与标准偏差图&#xff09;&#xff1a; X-Bar代表样本均值&#xff0c;S代表…

HttpServletRequest对象与RequestDispatcher对象

一、HttpServletRequest对象 1.介绍 在Servlet API中&#xff0c;定义了一个HttpServletRequest接口&#xff0c;它继承自ServletRequest接口&#xff0c;专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分&#xff0c;因此&#xff0c;在…

ODrive移植keil(五)—— 开环控制和电流变换

目录 一、开环控制1.1、控制原理1.2、硬件接线1.3、代码说明1.4、程序演示1.5、程序架构的体现 二、电流变换2.1、理论说明2.2、代码说明 ODrive、VESC和SimpleFOC 教程链接汇总&#xff1a;请点击 一、开环控制 在SimpleFOC系列中有开环控制的教程&#xff0c;SimpleFOC移植S…

《Java极简设计模式》第08章:外观模式(Facade)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 源码地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

SpringBoot篇之集成Mybatis-plus

目录 前言一、Mybatis-plus介绍1.1 官网 二、代码生成器总结 前言 大家好&#xff0c;我是AK&#xff0c;整理的SpringBoot集成Mybatis-plus以及代码生成器的使用&#xff0c;时间原因简单的整理下&#xff0c;有问题的可以评论区见或私信我。 一、Mybatis-plus介绍 1.1 官网…

完整教程:Java+Vue+Websocket实现OSS文件上传进度条功能

引言 文件上传是Web应用开发中常见的需求之一&#xff0c;而实时显示文件上传的进度条可以提升用户体验。本教程将介绍如何使用Java后端和Vue前端实现文件上传进度条功能&#xff0c;借助阿里云的OSS服务进行文件上传。 技术栈 后端&#xff1a;Java、Spring Boot 、WebSock…

23种经典设计模式:单例模式篇(C++)

前言&#xff1a; 博主将从此篇单例模式开始逐一分享23种经典设计模式&#xff0c;并结合C为大家展示实际应用。内容将持续更新&#xff0c;希望大家持续关注与支持。 什么是单例模式&#xff1f; 单例模式是设计模式的一种&#xff08;属于创建型模式 (Creational Pa…

PHP 员工工资管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 员工工资管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php员工工资管理系统 代码 https://download.csdn.net/download/qq_41221322/884215…

python+opencv+深度学习实现二维码识别 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

Python高效实现网站数据挖掘

在当今互联网时代&#xff0c;SEO对于网站的成功至关重要。而Python爬虫作为一种强大的工具&#xff0c;为网站SEO带来了革命性的改变。通过利用Python爬虫&#xff0c;我们可以高效地实现网站数据挖掘和关键词分析&#xff0c;从而优化网站的SEO策略。本文将为您详细介绍如何利…

竞赛选题 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

KubeVela跨地域的多集群管理方案

随着公司全球化战略的布局,业务呈点状分布在亚太、美东、欧洲等多个地域,云原生kubevela在跨地域多集群管控方面也遇到网络上的互通问题。 在公司网络规划上只允许一个区域的一个VPC跟另一个区域的一个VPC打通,同区域不同机房的网络都可以打通的网络架构基础上,由于一个区…

生产级Stable Diffusion AI服务部署指南【BentoML】

在本文中&#xff0c;我们将完成 BentoML 和 Diffusers 库之间的集成过程。 通过使用 Stable Diffusion 2.0 作为案例研究&#xff0c;你可以了解如何构建和部署生产就绪的 Stable Diffusion 服务。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 Stable Diffusion 2.0 …

睿趣科技:未来抖音开网店还有前景吗

随着科技的快速发展&#xff0c;电商平台已经成为了人们生活中不可或缺的一部分。在中国&#xff0c;抖音作为一个短视频平台&#xff0c;近年来迅速崛起&#xff0c;吸引了大量的用户和商家。那么&#xff0c;在未来&#xff0c;抖音是否还能为商家提供一个有效的电商平台呢?…