flutter混合开发-android studio 集成

官方文档:集成 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
                }
            }
        }
    }
}


先写到这儿,遇到问题会再来更新的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容