(原创)Flutter基础入门:手把手教你搭建Flutter混合项目:模块代码依赖方式集成

news2024/11/27 22:30:07

前言

Flutter是Google开源的构建用户界面(UI)工具包
支持在不同平台构建一致的ui效果
但在实际业务中,一般不会整个APP都用纯Flutter开发
尤其一些老的项目,会采用接入Flutter的方式来混合开发
那么今天就主要讲一下如何搭建一个Flutter的混合项目

混合项目实现方式

目前官方提供了两种方式添加依赖关系,他们的介绍分别如下:

方式一:模块代码依赖模式

这种方式是将flutter代码引入android项目,flutter代码对原生可见
好处是确保了一步完成Android项目和Flutter模块的编译。
对于同时涉及两个部分并且快速迭代很方便,
但这需要团队的每个人成员都安装Flutter SDK来确保顺利编译这个混合app。

方式二:AAR依赖模式

这种方式是将flutter代码打包成aar引入android项目,flutter代码对原生不可见
AAR模式有个好处就是团队中的其他成员不需要安装Flutter SDK,
最少只需要一个人输出AAR即可。

限于篇幅原因,今天这篇博客主要讲方式一的实现,
方式二的我单独写了一篇博客:
Flutter基础入门:手把手教你搭建Flutter混合项目:AAR方式集成

模块代码依赖模式实现

手动创建Flutter模块

首先我们新建一个简单的Android项目
然后进入到项目目录
打开cmd窗口,输入以下命令:

flutter create -t module --org com.xiongyp flutterxiongmodule

这样就创建了一个包名为com.xiongyp.flutterxiongmodule的Flutter模块
这里注意一点,Flutter模块放在其他目录下创建也是可以的
只要后面配置好地址,能链接到这个目录就好

引入Flutter模块

在Android项目的settings.gradle中将Flutter模块作为子项目引入
settings.gradle这样写:

rootProject.name = "FlutterHybridProject"
include ':app'
setBinding(new Binding([gradle: this]))                                           // 新增
evaluate(new File(                                                                // 新增
        settingsDir.parentFile,                                                   // 新增
        "${rootProject.name}/flutterxiongmodule/.android/include_flutter.groovy"  // 新增
))                                                                                // 新增
include ':flutterxiongmodule'

这里注意下:如果你的Flutter模块放在其他目录下
记得把include_flutter.groovy文件的路径配置准确
也就是这一行:

"${rootProject.name}/flutterxiongmodule/.android/include_flutter.groovy"

配置好了之后将settings.gradle的

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}

改为:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}

区别主要在:RepositoriesMode.PREFER_PROJECT
具体解释为:

FAIL_ON_PROJECT_REPOS :在项目的子 module 中配置仓库信息会导致编译失败。
PREFER_PROJECT:使用子 module 中配置仓库信息,忽略根目录中 settings 配置的仓库信息
PREFER_SETTINGS:使用根目录中 settings 配置的仓库信息,忽略子 module 中配置仓库信息

完成上面操作后,在project的build.gradle的

task clean(type: Delete) {
    delete rootProject.buildDir
}

上方添加:

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

完整的build.gradle的文件如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

至此,大体上一个混合的Android原生+Flutter项目的初步构建就完成了。
接下来就是页面的跳转了

页面跳转

Android原生打开Flutter页面
默认的跳转方式会出现明显的白屏,体验上很不好,这里直接给出优化后的方式
使用FlutterEngine缓存并复用
1.在app的AndroidManifest.xml中注册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>

2.在app中创建一个App.kt继承Application并在AndroidManifest.xml中配置给application节点的name属性

class App : Application() {
    ···
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiongyp.flutterxiongmodule">

    <application
        android:name=".App"
        ···
</manifest>

3.在App.kt中准备好FlutterEngine
创建FlutterEngine实例

    private val flutterEngine by lazy {
        FlutterEngine(this).apply {
            dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
        }
    }

重写onCreate()并将实例存储在FlutterEngineCache中

override fun onCreate() {
    super.onCreate()

    FlutterEngineCache.getInstance().put("your_engine_id", flutterEngine)
}

重写onTerminate()并将实例销毁

override fun onTerminate() {
    super.onTerminate()

    flutterEngine.destroy()
}

在业务需要的地方使用FlutterEngine中的Intent实例进行跳转

    findViewById<TextView>(R.id.textView).setOnClickListener {
        startActivity(FlutterActivity.withCachedEngine("your_engine_id").build(this))
    }

选择app进行run,如果遇到如下Java版本问题,请进行如下配置变更

A problem occurred evaluating project ':flutter'.
> Failed to apply plugin 'com.android.internal.library'.
   > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
     You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

选择 Project Structure > SDK location > Gradle Settings 设置Gradle JDK为11
在这里插入图片描述
在./gradle.properties中添加上文中对应的java.home路径

# replace with your own jdk11 or above
org.gradle.java.home=C\:\\Softwares\\Google\\Android\\Android_Studio\\jre

sync后应该就可以顺利的运行你的项目了

导入Moudle

上面讲的是用flutter命令创建了FlutterMoudle然后引入到安卓工程
其实也可以用Android Studio来创建一个FlutterMoudle
下面讲两种用Android Studio来创建一个FlutterMoudle的方法

方式一

如下图:
在这里插入图片描述
之后输入Flutter module的Project name,选择Flutter SDK所在的路径,选择Flutter module的文件位置,最后输入Flutter module的描述,然后Next,如下图所示
在这里插入图片描述
上诉基本信息填充完毕后,点击Next,在弹出的面板中输入Flutter module的包名,如下图所示
在这里插入图片描述
输入Package name后点击Finish后Flutter module就正式创建完毕。
创建好的flutter module和新建的flutter项目在内容上基本没有差别。

方式二

当然,有的人会发现自己的Android Studio在创建Moudle时没有Flutter Moudle选项,如下图
在这里插入图片描述
估计是不同版本AS的区别,这时我们可以选择创建Flutter Project
在这里插入图片描述
选择下一步:
在这里插入图片描述
然后在下拉框里选择moudle,点击create就好了
在这里插入图片描述
注意,创建好的FlutterMoudle记得在Android项目的settings.gradle里配置好路径
你也可以直接放到Android项目的目录下,然后配置路径

gradle版本适配

上面讲的是Gradle7.X的项目如何集成FlutterMoudle进行混合开发
具体Gradle7.X有哪些改变,可以上网查下资料或参考下面博文:
gradle7 从上手到实践之上手体验
那么如果是老的项目,它的Gradle版本和写法是7.X之前的,就需要另外处理
这里也提一下
首先是settings.gradle文件,写法和之前差不多,全部内容如下:

rootProject.name = "FlutterHybridProject"
include ':app'
setBinding(new Binding([gradle: this]))                                // 新增
evaluate(new File(                                                     // 新增
        settingsDir.parentFile,                                              // 新增
        "${rootProject.name}/flutterxiongmodule/.android/include_flutter.groovy"  // 新增
))                                                                     // 新增
include ':flutterxiongmodule'

改动比较大的是build.gradle文件,这里也全部贴上来:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

至此,第一种搭建Flutter混合项目的方式就讲完了

源码分享以及使用

文章里相关代码都放到gitee上面了,需要的可以自取哈
FlutterHybridProject
不同的分支是各自的集成方式示例,区别如下:

  • master 一个简单的安卓Helloworld项目
  • old_gradlesetting 模块代码依赖模式:Gradle版本低于Gradle7.X方式集成
  • new_gradlesetting 模块代码依赖模式:Gradle7.X方式集成
  • aar_flutter AAR依赖模式:基于Gradle7.X版本

在你引用其他人的FlutterMoudle或者网上下载一些FlutterMoudle案例时
如果发现FlutterMoudle里面没有.android .ios .idea 等临时文件不存在时
可以在FlutterMoudle文件夹下打开cmd控制台
输入以下命令:

flutter create .

回车后系统便会自动为你生成这些对应的临时文件了
这时你就可以正常运行项目并进行开发了!
参考解决方法:
Flutter 报错 ( Could not read script ‘xxx\flutter_tools\gradle\app_plugin_loader.gradle‘ )

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外卖app开发流程全解析

外卖app开发是现代餐饮业的一个必备部分。在这个数字化时代&#xff0c;人们更愿意使用手机应用程序来订购食品。因此&#xff0c;为了满足客户需求&#xff0c;餐饮企业需要开发自己的外卖app。 第一步&#xff1a;确定目标受众 在开始外卖app的开发之前&#xff0c;需要确定…

Shiro-721---漏洞复现

漏洞原理 Shiro rememberMe 反序列化远程代码执行漏洞 由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存 在问题&#xff0c;用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段&#xff0c;并重新请求网站&#xff0c;进…

latex论文排版个人向相关问题记录

很久没更新了&#xff0c;小论文基本都见刊了&#xff0c;记录下之前写论文碰上的latex一些排版问题吧&#xff0c;比较琐碎。 伪代码跨页问题 最开始使用algorithms包来写的伪代码&#xff0c;左边会有大方括号&#xff0c;蛮好看的。 不过使用algorithms包进行伪代码撰写&a…

Java语言----动态顺序表(ArrayList)

目录 一.顺序表 二.顺序表的手动实现 2.1顺序表的创建 2.2.基本功能的实现 2.2.1扩容顺序表 2.2.2 判断顺序表是否为满 2.2.3 判断顺序表是否为空 2.2.4打印顺序表 2.2.5清空顺序表 2.3四大功能的实现 2.3.1增加元素 2.3.2删除元素 2.3.3查找元素 2.3.4更改数据 总代码 &a…

记录-有意思的气泡 Loading 效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 今日&#xff0c;群友提问&#xff0c;如何实现这么一个 Loading 效果&#xff1a; 这个确实有点意思&#xff0c;但是这是 CSS 能够完成的&#xff1f; 没错&#xff0c;这个效果中的核心气泡效果&am…

【SpringCloud常见面试题】

SpringCloud常见面试题 1.微服务篇1.1.SpringCloud常见组件有哪些&#xff1f;1.2.Nacos的服务注册表结构是怎样的&#xff1f;1.3.Nacos如何支撑阿里内部数十万服务注册压力&#xff1f;1.4.Nacos如何避免并发读写冲突问题&#xff1f;1.5.Nacos与Eureka的区别有哪些&#xff…

易岸公考:公务员有五种类型可以挑选?

公务员分为国试、省试、选拔、乡镇公务员、选拔等不同考试&#xff1b; 不符合选拔选调生条件的&#xff0c;可选择国考、省考、乡镇公务员。 成为公务员后&#xff0c;遴选是你必不可少的晋升渠道。 一、国家考试 国考是指中央和国家机关的公务员考试&#xff0c;其招录机构…

关于TypeVariable的深度理解

在看java源码时&#xff0c;如果涉及到反射&#xff0c;会经常看到TypeVariable。 那么这玩意到底是个什么东西&#xff1f; 这是个必须要搞清楚的概念&#xff0c;否则很难理解源码的意图是什么&#xff1f; 我在这里先给出结论&#xff1a;这个问题的关键是具体类型和类型变…

Linux shell编程 循环语句for while实例

while 循环创建用户 i1 while [ $i -le 10 ] do useradd user${i} echo "123456" | passwd --stdin user${i} &> /dev/null let i done猜测价格 [rootxue opt]# cat caijia.sh price$[RANDOM%1001] #0-32767 i0 while true doread -p "input the price&…

尚融宝25-投资列表展示以及实现充值功能

目录 一、展示投资列表 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 二、充值功能 &#xff08;一&#xff09;需求 1、需求描述 2、流程 &#xff08;二&#xff09;充值 1、后端 2、前端 &#xff08;三&…

第九章 C#脚本(下)

本章节我们说一说MonoBehaviour这个类&#xff0c;它的内部有很多方法用来执行不同的逻辑。Unity脚本从唤醒到销毁都有着一套比较完善的生命周期&#xff0c;添加任何脚本都要遵守生命周期法则&#xff01;直白的讲&#xff0c;就是MonoBehaviour类中的方法的执行是有严格的顺序…

Windows强制删除文件夹

命令&#xff1a;rd/s/q 路径 如果文件较大&#xff0c;需要等待几分钟&#xff0c;但一定会删掉的。

使用Fork和GitHub完成团队项目开发

前提 拥有自己的GitHub账号项目组组长已经创建好了 一个远程仓库能够科学上网安装了Fork软件 基础步骤 该内容分为两个部分&#xff0c;分别为团队协作者&#xff08;项目成员&#xff09;和团队组织者&#xff08;项目组长&#xff09;&#xff0c;我们首先来介绍作为项目成员…

Docker-Compose 了解 部署nginx与lnmp

Docker-Compose Docker-compose 简介YAML 文件格式及编写注意事项Docker Compose配置常用字段Docker Compose 常用命令Docker Compose 文件结构部署 composeDocker Compose 环境安装 compose部署nginx&#xff08;1&#xff09;准备依赖文件编写配置文件docker-compose.yml com…

学生无线耳机哪款好?两百左右适合学生党的无线耳机推荐

学生无线耳机哪款好&#xff1f;现如今&#xff0c;学生党也成为了蓝牙耳机的主要用户群体之一。接下来&#xff0c;我来给学生群体推荐几款两百左右的无线耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a;299 南卡小音舱的音质和佩戴体验都在…

Vue过渡与动画的实现效果

使用 transition 标签配合 CSS3 过渡实现【不完整代码】&#xff1a; Vue 还提供了四个 class 类名&#xff0c;分别是进入的起点&#xff08;v-enter&#xff09;进入的终点&#xff08;v-enter-to&#xff09;离开的起点&#xff08;v-leave&#xff09;离开的终点&#xff…

纷享销客标讯通,大客招标经营的杀手锏

呀&#xff0c;对手都中标了&#xff0c;我咋才知道&#xff1f;呀&#xff0c;能不能预测目标客户的招标&#xff1f;呀&#xff0c;对手有什么客户可以挖一挖&#xff1f; 呀&#xff0c;ROI 300倍的奥秘是什么&#xff1f; 纷享销客标讯通&#xff0c;帮助企业&#xff1a…

射频基础(一)

目录 一、电磁波 二、直射波 三、反射波 四、绕射波 五、散射波 六、趋肤效应 七、多径效应 八、阴影效应 九、菲涅尔区 十、慢衰落和快衰落 一、电磁波 电磁波是能量的一种&#xff0c;凡是高于绝对零度的物体&#xff0c;都会释出电磁波。电与磁可说是一体两面&#xff0c;电…

85.qt qml-炫酷烟花粒子特效(支持多种爆炸模式(文字)、爆炸阴影、背景场景)

效果如下所示: 截图如下所示: 实现内容如下所示: 1.实现多个爆炸效果2.爆炸的时候增加光度阴影效果3.由于场景有湖面,所以还需要增加一个倒影粒子组首先我们来学习下,该示例中所需要常用的类型点 1.如何更改粒子生命周期时的颜色变换动画 方法有两种。 1.1通过colorTable和s…

在 PDF 中添加文本的 3 种简单方法

我们更喜欢将我们的文件保存为 PDF 并打印它&#xff0c;这样打印的文件将保持原始的完美结构。你不得不承认&#xff0c;有时候&#xff0c;当你打印一个 Word 文件时&#xff0c;它可能会打印出乱七八糟的排版&#xff0c;这对进一步的工作来说是令人沮丧的。 PDF在我们的日…