Flutter混合开发实战(一)项目导入
前言
首先得说明一下为什么要学习flutter和原生混合开发,起因是我之前面试了某大厂,本来一切都进行得很顺利,直到面试官问了我一句:“你有过混合开发的经验吗?”。我顿时呆住了,内心OS:我大flutter蒸蒸日上,遥遥领先,为啥要学混合开发。当然表面我只能硬着头皮说没有...不出意料的过了段时间我收到了邮件说我面试没有通过。所幸之前在面试结束时我问了面试官:“您觉得我哪方面需要补足一下?”,面试官当时愣了一会,然后说:“我觉得你可以学习一下混合开发,毕竟纯flutter是没有出路的。”,OMG我大flutter居然没有出路,刹那间我仿佛五雷轰顶,外焦里嫩,本来以为只要学会flutter,就能等着它自己发展壮大坐收渔利,没想到现实给了我沉痛一击。后来我在boss上浏览了大部分flutter岗位要求,有七八成是要求掌握java、kotlin、swift等语言的,剩下的也基本要求有相关原生经验。自此我便踏上了混合开发之路...
一、原生引入flutter模组
1、首先创建flutter module,这一步没什么好说的,模组项目注意要和原生项目同级目录,创建flutter项目的时候把这里的类型改成Module就欧了
2、在原生项目的project目录下找到settings.gradle文件,将以下代码复制进去,注意把fluttermix改成flutter模组的项目名,这里有个大佬写的是settingsDir.parentFile,但是我写进去后报错了,改成这样才能运行,报错的朋友可以改一下
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
'fluttermix/.android/include_flutter.groovy'
))
app级目录下找到build.gradle文件,在dependencies中添加依赖
implementation project(':flutter')
补充说明一下,做完以上步骤sync时有人会报错(才不是我),大概率是jdk版本和gradle版本冲突导致的,也有可能是flutter sdk冲突,这时候最好上google找一下解决方法,国内这搜索引擎实在是一言难尽...还有最好把模组也单独跑一下,可能会遇到换源、gradle版本问题
3、先试试能不能运行起来,如果可以再进行以下步骤
在原生项目AndroidManifest文件的application层级里导入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"
/>
4、随便在一个点击事件里调用跳转
startActivity(
FlutterActivity.createDefaultIntent(ACTIVITY)
);
这是默认跳转flutter 的main函数,如果成功了就代表引入成功了,后续再进行其他开发。
二、导入AAR包
1、在模组项目里运行控制台,输入
flutter build aar
会得到以下输出
Consuming the Module
1. Open <host>\app\build.gradle
2. Ensure you have the repositories configured, otherwise add them:
String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
repositories {
maven {
url 'E:\android studio\fluttermix\build\host\outputs\repo'
}
maven {
url "$storageUrl/download.flutter.io"
}
}
3. Make the host app depend on the Flutter module:
dependencies {
debugImplementation 'com.example.fluttermix:flutter_debug:1.0'
profileImplementation 'com.example.fluttermix:flutter_profile:1.0'
releaseImplementation 'com.example.fluttermix:flutter_release:1.0'
}
4. Add the `profile` build type:
android {
buildTypes {
profile {
initWith debug
}
}
}
这其实是在教我们怎么引用aar
2、在项目级setting.gradle中添加以下代码
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
repositories {
google()
mavenCentral()
maven {
url 'E:/android studio/fluttermix/build/host/outputs/repo'
}
maven {
url "$storageUrl/download.flutter.io"
}
}
}
3、在app级build.gradle中添加以下代码
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
profile {
initWith debug
}
}
在dependencies中添加以下代码,注意替换名字
debugImplementation 'com.example.fluttermix:flutter_debug:1.0'
profileImplementation 'com.example.fluttermix:flutter_profile:1.0'
releaseImplementation 'com.example.fluttermix:flutter_release:1.0'
4、最后在AndroidManifest中引用,和导入模组的步骤一样,就不赘述了
总结
虽然文章很短,但是我足足花了两天才运行起来,就是因为某些镜像问题导致的,不论是内网外网都找不到解决办法,后来还是看到了一篇不起眼的博客才解决的。所以大家碰上此类问题一定一定,千万千万要记录下来,省得下次抓瞎。
这两种引入方式各有优劣,以下是官方文档原话:
- AAR 集成 AAR 机制可以为每个 Flutter 模块创建 Android AAR 作为依赖媒介。当你的宿主应用程序开发者不想安装 Flutter SDK 时,这是一个很好方案。但是每次修改都需要重新编译。
- 模块源码集成 直接将 Flutter 模块的源码作为子项目的依赖机制是一种便捷的一键式构建方案,但此时需要另外安装 Flutter SDK,这是目前 Android Studio IDE 插件使用的机制。
总结一下就是aar适合团队使用,不用每个人都配置flutter,一人开发其他人导入aar后能直接用;而模组形式则要求开发者必须配置flutter sdk,但是胜在编写代码方便,哪里出错了直接打开模组文件改就行。
目前尚不清楚大厂倾向于哪种方式,有了解的朋友可以在评论区说明一下,我也挺想知道的,感谢!
最后的最后,叮嘱刚入门的朋友一句:
强烈建议跟着官方文档走一遍!!!
转载自:https://juejin.cn/post/7352728445963501618