原生安卓与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

  3. 创建好之后打开flutter项目下的Terminal。

  4. 在终端中输入flutter pub get获取flutter依赖。

    flutter pub get

  1. 在原生安卓项目的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 password
    password = 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 password
    password = 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'

  2. 此时在原生安卓的代码中添加跳转至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")
         }
  2. 接下来在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"
         }
  2. 在完成上述条件后,原生项目在需要的地方直接跳转flutter项目即可。

    val intent: Intent = FlutterActivity.createDefaultIntent(activity)
    activity.startActivity(intent)

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

相关推荐
lbb 小魔仙12 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY9:获取分类数据并渲染
flutter·华为·harmonyos
mocoding12 小时前
Flutter 3D 翻转动画flip_card三方库在鸿蒙版天气预报卡片中的实战教程
flutter·3d·harmonyos
JMchen12313 小时前
现代Android图像处理管道:从CameraX到OpenGL的60fps实时滤镜架构
android·图像处理·架构·kotlin·android studio·opengl·camerax
2601_9498095914 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
快点好好学习吧14 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
是誰萆微了承諾14 小时前
php 对接deepseek
android·开发语言·php
2601_9498683614 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
Dxy123931021615 小时前
MySQL如何加唯一索引
android·数据库·mysql
一起养小猫15 小时前
Flutter for OpenHarmony 实战:别踩白方块游戏完整开发指南
flutter·游戏
●VON16 小时前
Flutter for OpenHarmony 21天训练营 Day03 总结:从学习到输出,迈出原创第一步
学习·flutter·openharmony·布局·技术