本文是针对 Android 项目添加 Flutter 模块的情况编写的。
在Terminal
执行下方命令
flutter create -t module --org com.randalldev fluttermodule
然后官方提供了两种方式添加依赖关系:
AAR
依赖模式
AAR
模式有个好处就是团队中的其他成员不需要安装Flutter SDK
,最少只需要一个人输出AAR
即可。
但是我个人不喜欢这种方式,我更倾向于git submodule
的项目管理方式,并且安装Flutter SDK
的成本实在算不上高,因此,这种方式,我按下不表。
模块代码依赖模式
这种方式确保了一步完成Android
项目和Flutter
模块的编译。这种方式对于你的开发同时涉及两个部分并且快速迭代很方便,但这需要团队的每个人成员都安装Flutter SDK
来确保顺利编译这个混合app
。
在主项目的settings.gradle
中将Flutter
模块作为子项目引入。
// Include the host app project.
include ':app' // 默认已有的配置
setBinding(new Binding([gradle: this])) // 新增
evaluate(new File( // 新增
settingsDir.parentFile, // 新增
"${rootProject.name}/fluttermodule/.android/include_flutter.groovy" // 新增
)) // 新增
此时
AS
会提示你gradle
配置变更了,需要重新sync
,别急,先别点!
此时当你点了sync会出现如下报错
* What went wrong:
A problem occurred evaluating script.
> Failed to apply plugin class 'FlutterPlugin'.
> Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by plugin class 'FlutterPlugin'
将project
的setting.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
}
}
此时当你点了sync会出现如下报错
A problem occurred evaluating project ':app'.
> Project with path ':fluttermodule' could not be found in project ':app'.
在project
的setting.gradle
的末尾添加
include ':fluttermodule'
此时当你点了sync
编译大概率能成功,但是会有很严重的警告
Failed to resolve: androidx.core:core-ktx:1.9.0
Add Google Maven repository and sync project
Show in Project Structure dialog
Affected Modules: app
在project
的build.gradle
的
task clean(type: Delete) {
delete rootProject.buildDir
}
上方添加
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
至此,大体上一个混合的Android
原生+Flutter
项目的初步构建就完成了。
Android
原生打开Flutter
页面
默认的跳转方式会出现明显的白屏,体验上很不好,这里直接给出优化后的方式
FlutterEngine
缓存并复用app
的AndroidManifest.xml
中注册FlutterActivity
app
中创建一个App.kt
继承Application
并在AndroidManifest.xml
中配置给application
节点的name
属性class App : Application() {
···
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.randalldev.hybridflutter">
manifest>
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`.
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
后应该就可以顺利的run
了获取方式: 点击 “此处” 即可 免费获取