前言
最近公司的项目用Flutter
技能栈比较多,有些需求可能还需求一些Android
原生的支撑,所以我做了一些Android
原生混合Flutter
开发的测验,参阅了一些文章,也遇到了一些问题,这儿把总结的经历共享出来。
本文是针对 Android 项目增加 Flutter 模块的状况编写的。
开发环境
- PC with Win10 20H2
- Android Studio Arctic Fox | 2020.3.1 Patch 2(试过小松鼠版别,太不喜欢了,电鳗就更没去测验)
- AGP 7.0.2
创立一个Android
项目
直接贴图带过了哈,这步应该都熟练的吧
创立一个Flutter
模块
这儿就有区别了,较新版的AS
中供给直接创立Flutter
模块的模板,可是我的北极狐版别没有,因此这儿演示两种方法:
AS
模板创立
在你的当前项目中,运用AS
菜单中的File > New > New Module… 创立一个新的Flutter
模块,或许挑选一个此前就已准备好的Flutter
模块。
假如你挑选创立一个新的模块,你能够运用导游来协助你设置模块的称号,模块寄存的位置之类的装备项。
- 因为我这儿还是北极狐版的
AS
,所以我并未实践官方供给的模板创立方法,依照官方的说法,它会主动帮你装备好依靠联系,但我也不确定会不会遇到问题,没有最好,有的话应该也都和手动创立的方法差不多。
手动创立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
,别急,先别点!假定
fluttermodule
是和app
目录同层级的。在
app
的build.gradle
中增加flutter
模块的依靠dependencies { implementation project(':flutter') }
官方的指南就到此为止了,与此一起,坑也来了/doge
排雷
此刻当你点了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
<activity android:name="io.flutter.embedding.android.FlutterActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:theme="@style/Theme.HybridFlutter" android:windowSoftInputMode="adjustResize" > </activity>
-
在
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"> <application android:name=".App" </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`.
-
挑选 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
后应该就能够顺畅的run
了
-
-
参阅文章
- Integrate a Flutter module into your Android project
- Android与Flutter混合开发
- android混合flutter