在Android 项目集成flutter的时候遇到的一些坑,给大家分享一下。
首先在选择集成flutter的方式,我本地安装了flutter环境,所以采用源码依赖的方式,编辑器是Android studio。
不知道是studio哪个版本之前,可以直接在编辑器Filer ->new module 中 直接新建flutter module,但是我现在的Android studio 版本(2020 fox 版本)在file-> new module 中已经没有直接新建flutter module的选项了:
所以就按照flutter文档上教程直接 手动创建flutter module:
打开终端,你可以cd 到你项目的同级目录创建,也可以在项目目录内向创建,但是后面在settings.gradle 里路径有所不同,后面会提到区别
flutter create -t module --org com.example my_flutter
"com.example" 是你flutter的包名,不能与主项目包名一样, “my_flutter”这个的名称随便取,但要和之后在settings.gradle里的路径名一样
执行完上面的命令后,你会在你项目的同级目录或项目内看到flutter module文件夹
将 Flutter 模块作为子项目添加到宿主应用的 settings.gradle 中:“ my_flutter” 名是刚才所创建的flutter module名称:
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // 项目同级目录的File路径
'my_flutter/.android/include_flutter.groovy' // new
))
!这里注意:如果你是在项目内创建的flutter module,那么Flie路径要去掉‘.parentFile’,否则找不到module:
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir, // 项目内的目录的File路径
'my_flutter/.android/include_flutter.groovy' // new
))
然后Sync 同步项目,然后在app的build.gradle里引入flutter module
dependencies {
implementation project(':flutter')
}
至此集成完毕。
2、接下来在运行项目时的问题:
Could not resolve io.flutter:flutter_embedding_debug:1.0.0-57d3bac3dd5cb5b0e464ab70e7bc8a0d8cf083ab.
原因是我开着vpn梯子,关闭vpn后运行正常!
3、辛苦完成集成并成功运行项目后,接着在打开flutter Activity时又出现问题了:、
首先在AndroidManifest.xml 注册flutter
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
确保使用如下的语句导入:
import io.flutter.embedding.android.FlutterActivity;
然后打开flutterActivity:
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("/my_route") //没有路由可以去掉这句
.build(currentActivity)
);
结果程序崩溃:
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/view/WindowInsetsControllerCompat;
谷歌查了查适配Androidx问题:
在这个地方的useVersion改成1.2.0以上,我目前使用的是1.7.0
if (details.requested.group == 'androidx.core') {
details.useVersion "1.7.0"
}
然后Sync 同步后,再次打开flutterActivity,便不再崩溃!