官方文档:集成 Flutter | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
但如果你的项目是陈年屎山,本身已经是java与kotlin 混合开发了,又想要集成,那可真是,“搬起石头砸自己的脚——自作自受” “哑巴吃黄连——有苦说不出”。中途无数次后悔想退出,无奈拿人工资,替人办事。总算趟出来了,看是否能帮上同样挠破头批的你。
首先,先别管flutter,确保你的gradle最低升级到8.0, gradle 同样升级到8.0.0,compileSdkVersion buildToolsVersion minSdkVersion targetSdkVersion 这些也同步升级。
很多同学在这一步倒下了,对内,项目中涉及到的一些sdk依赖,配置文件声明,有众多联系,对外,涉及到一些三方自动打包工具编译环境,也会有众多关联。
屎山代码真的改动太大,结构改动太多了。TAT
其次,创建flutter module。
1,确保flutter sdk 大于 3.27.0 版,达不到就去升级。
2,使用模块源码集成的方式时,确认项目使用的是kotlin版本还是Groovy版本;可以根据settings.gradle判断,如果是“settings.gradle.kts”,则按照kotlin版本方式集成
3,报错找不到 include_flutter.groovy。 demo里给的逻辑是 as项目和flutter module平级,如果flutter 在 as 项目下,修改路径即可
def filePath = settingsDir.parentFile.toString() + "/flutter_module/.android/include_flutter.groovy" // new
4,如果你的项目,不是以app模块为启动项目,需要在gradle.properties 文件中设置 flutter.hostAppProjectName ,如下:
flutter.hostAppProjectName = xxx_app:xxx_yyy
1,Ladybug 版本的 android studio,创建新的flutter module 的步骤更改为:File -> New Flutter Project -> Generators 选择Flutter ,配置好SDK,next -> Project type 选择Module
2,左上角提醒: 'Dart support is not enabled for the module xx',最好忽略这个提示,不要跟着配置 setting -> Language -> dart/flutter。 继续在新窗口开发 flutter
3,突然出现,“Process 'command 'xxxxxxx\bin\flutter.bat'' finished with non-zero exit value 1”
搞了很久,好痛苦。TAT。
(1)先新窗口运行 flutter module,看是否能成功运行
(2)如果可以,查看 flutter module 下的 .android -> gradle -> wrapper -> gradle-wrapper.properties 下的 distributionUrl ,是否 gradle 版本与 as 项目配置的不同
如果不同,则更新as项目对应的 distributionUrl、compileSdk/minSdk/targetSdk、‘com.android.tools.build:gradle:xxx’版本
(3)clean rebuild 解决
4,突然报错: '> Could not read script 'xxx\flutter_module.android\include_flutter.groovy' as it does not exist.'
不要着急,新窗口运行 flutter module , 命令行执行 flutter clean ,再执行 flutter pub get,即可。会重新编译生成 .android 文件夹
5,突然报错: ‘cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module @0x253afb25’
解决办法见: kapt不兼容JDK 16:KaptContext cannot access class com.sun.tools.javac.util.Contex_java.lang.illegalaccesserror: class org.jetbrains.-CSDN博客
首先确定,我的JDK=17,gradle版本适配无法降低JDK,我用的方案二,clean rebuild 解决了
6,继续报错: ' Could not create task ':webview_flutter_android:generateDebugUnitTestConfig'. this and base files have different roots: '
解决办法见: Flutter 报错 Could not create task ‘xxx‘.this and base files have different roots_this and base files have different roots:-CSDN博客
7,继续报错:‘ superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler (in unnamed module @0x75aadaf1) cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module ’
解决办法:我首先确保了,我的kotlin版本、gradle 版本、jdk 版本是相互匹配的。
问了ds,ds给的解决办法解决了我的问题:
二、升级 Kotlin 和 KAPT 版本
新版本 Kotlin 可能已修复兼容性问题:
修改项目级 build.gradle
groovy
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.9.22' // 使用最新稳定版
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22"
}
更新 KAPT 插件配置
groovy
kapt {
useBuildCache = true
correctErrorTypes = true // 避免类型解析错误
}
注意:Kotlin ≥1.8.0 对 JDK 17+ 兼容性显著优化
8,仍然报错 ' There are multiple good constructors and Room will pick the no-arg construct '
解决办法:升级Room ,这是我的koltin 和 ROOM 版本
private const val VersionKotlin = "1.8.22"
private const val VersionRoom = "2.6.0"
9,报错: "The current Dart SDK version is xxx. Because flutter_module3 requires SDK version xxx, version solving failed."
解决办法:首先 flutter --version 确定当前的 flutter 和 dart 版本,和官网匹配对比,归档列表 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
如果发现确实是匹配的【一般都是匹配的】,检查 android studio 里,运行的项目是安卓项目还是 flutter module。我这里打开安卓项目的窗口,运行了flutter module,就一直报错,切了运行就没问题了
10,依赖了 flutter-boost 以后,Logger 报错: Error: 'Logger' is imported from both 'package:flutter_boost/src/logger.dart' and 'package:logger/src/logger.dart'.
解决办法:
import 'package:logger/logger.dart' as Log;
final logger = Log.Logger();
11,A problem occurred configuring project ':flutter_boost'. > Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
gradle 升到8.0以后,要强制指定 namespace
解决办法:项目级 build.gradle 中,添加
subprojects {
afterEvaluate { project ->
if (project.hasProperty('android')) {
project.android {
if (namespace == null) {
namespace project.group
}
}
}
}
}
先写到这儿,遇到问题会再来更新的。