当前位置: 首页 > news >正文

原生安卓与flutter混编的实现

方案一

  1. 打开顶部窗口Flie->New->New Flutter Project。打开后如下
    在这里插入图片描述
    此处的flutter sdk可自行下载,不做赘述。
  2. 选好sdk后点击下一步。
    在这里插入图片描述
    此处的Project location为原生安卓根目录,Project type为Module.
    亦可在原生安卓项目根目录下打开Terminal执行以下命令。
flutter create -t module --org com.example flutter_module
  1. 创建好之后打开flutter项目下的Terminal。
    在这里插入图片描述
  2. 在终端中输入flutter pub get获取flutter依赖。
flutter pub get

在这里插入图片描述
5. 在原生安卓项目的settings.gradle文件中添加flutter_module,添加到末尾即可。

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

在这里插入图片描述
其中flutter_module为flutter的项目名。

  1. 在原生安卓的app下build.gradle中添加依赖。
implementation project(':flutter')

在这里插入图片描述
此时同步项目会发现有如下报错。
在这里插入图片描述

  1. 在原生安卓项目的settings.gradle中将repositoriesMode设置为PREFER_SETTINGS再次同步即可。
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

在这里插入图片描述
同步完之后会发现缺少io.flutter的包,此时即便运行也会包一样的错误。

  1. 在原生安卓项目的settings.gradle中引入io.flutter的仓库,再次同步即可,完整内容如下。
pluginManagement {repositories {google()mavenCentral()maven{ url 'https://maven.aliyun.com/repository/jcenter' }maven{url 'https://api.mapbox.com/downloads/v2/releases/maven'authentication {basic(BasicAuthentication)}credentials {// Do not change the username below.// This should always be `mapbox` (not your username).username = "mapbox"// Use the secret token you stored in gradle.properties as the passwordpassword = MAPBOX_DOWNLOADS_TOKEN}}maven {url 'https://jitpack.io'}maven {url 'https://developer.huawei.com/repo/'}maven { url 'https://repo1.maven.org/maven2/' }gradlePluginPortal()String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"maven {url "$storageUrl/download.flutter.io"}}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)repositories {google()mavenCentral()maven{ url 'https://maven.aliyun.com/repository/jcenter' }maven{url 'https://api.mapbox.com/downloads/v2/releases/maven'authentication {basic(BasicAuthentication)}credentials {// Do not change the username below.// This should always be `mapbox` (not your username).username = "mapbox"// Use the secret token you stored in gradle.properties as the passwordpassword = MAPBOX_DOWNLOADS_TOKEN}}maven {url 'https://jitpack.io'}maven {url 'https://developer.huawei.com/repo/'}maven { url 'https://repo1.maven.org/maven2/' }String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"maven {url "$storageUrl/download.flutter.io"}}}
rootProject.name = "HuidaPartner"
include ':app'
include ':libbase'
include ':HttpMqtt'
include ':map'setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir,'flutter_module/.android/include_flutter.groovy'
))include ':flutter_module'
  1. 此时在原生安卓的代码中添加跳转至flutter页面就没有什么问题了。
val intent: Intent = FlutterActivity.createDefaultIntent(activity)
activity.startActivity(intent)

上述时一个简单的跳转至flutter主界面。

方案二
上述方案一是针对较老的flutter sdk的,对于新版本的sdk官方推荐的方式是以aar的方式引用。引用的方式是以maven仓库的形式。针对maven仓库,本选用本地maven仓和远程maven仓,本文只简单介绍本地maven仓的方式。

  1. 参照方案一的步骤,直至到第4步,创建好flutter_module项目,之后在flutter_module下打开Terminal,输入
flutter build aar

在这里插入图片描述

在等待一段时间后,会在flutter_module项目的/flutter_module/build/host/outputs/repo目录下生成flutter_debug、flutter_profile、flutter_release三个文件,如下所示。
在这里插入图片描述
是不是感觉这个目录结构很眼熟,没错,这结构就是典型的maven仓库的结构,对应的文件也是一应俱全。不熟悉maven本地仓库的可以参考:安卓本地Maven仓的实现这篇文章。

  1. 由于是使用本地代码仓的缘故,flutter_module项目又在我们的原生项目下,可以在settings.gradle中直接引用本地仓库。
		maven {url uri("file://${settingsDir}/flutter_module/build/host/outputs/repo")}
  1. 接下来在build.gradle中按照正常的依赖格式引用即可。
    debugImplementation 'com.example.flutter_module:flutter_debug:1.0'releaseImplementation 'com.example.flutter_module:flutter_release:1.0'

在这里插入图片描述

此处我只引用的debug包和release包,正常情况下我们只需要使用到这两个包。

  1. 当然,io:flutterde的包的引用也是必不可少的,在settings.gradle中引入对应的maven仓
    String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"maven {url "$storageUrl/download.flutter.io"}
  1. 在完成上述条件后,原生项目在需要的地方直接跳转flutter项目即可。
val intent: Intent = FlutterActivity.createDefaultIntent(activity)
activity.startActivity(intent)

如果想使用远程maven仓的形式,可以参考:安卓使用Gitee搭建远程Maven仓,完成远程maven仓的搭建后,在settings.gradle将仓库替换即可。

http://www.dtcms.com/a/307568.html

相关文章:

  • 如何使用一台电脑adb调试多个Android设备
  • AI 如何评价股票:三七互娱(SZ:002555),巨人网络(SZ:002558)
  • 解决:MATLAB 已经画好了Figure,想在不重新绘图的情况下去掉坐标轴刻度线
  • Java 大视界 -- Java 大数据在智能医疗远程健康监测与疾病预防预警中的应用(374)
  • 《以终为始,不辩过程》
  • cartographer 概率栅格地图
  • JVM面试通关指南:内存区域、类加载器、双亲委派与GC算法全解析
  • 一万字讲解Java中的IO流——包含底层原理
  • GCC/G++ + Makefile/make 使用
  • Visual Studio调试技巧与函数递归详解
  • “0 成本开跨境店” 噱头下的优哩哩:商业模式深度剖析
  • 5G 单兵终端 + 无人机:消防应急场景的 “空 - 地” 救援协同体系
  • 【可用有效】Axure RP 9 授权码
  • imx6ull-驱动开发篇5——新字符设备驱动实验
  • springcloud04——网关gateway、熔断器 sentinel
  • cas自定义返回信息和自定义认证
  • 考研408_数据结构笔记(第三章栈、队列和数组)
  • 解构衡石嵌入式BI:统一语义层与API网关的原子化封装架构
  • Vue 中使用 Dexie.js
  • 城市客运安全员证考试难不难?如何高效备考
  • CUDA系列之常用Runtime API简介
  • BatchNorm 一般放在哪里?
  • Ⅹ—6.计算机二级综合题19---22套
  • 接口自动化测试以及requests
  • TS语法最佳实践
  • 【笔记】热力学定律推导(6)热力学第二定律推导
  • 【MATLAB】(二)基础知识
  • Golang 指针
  • Valgrind终极指南:深入内存安全与性能瓶颈检测
  • 云原生运维与混合云运维:如何选择及 Wisdom SSH 的应用