问题背景
我用的IDE是IntelliJ IDEA,当我首次用它创建了一个Flutter插件项目后,我发现Android平台部分的代码,都无法正常索引,(也就是代码无法跳转,无法自动补全。)但是工程是可以正常编译运行的。
按照Flutter官方文档(docs.fluttercn.cn/tools/andro... )里给的方法都试了,还是不正常。况且我也不想flutter代码用IDEA写,Android代码再用Android studio写,好蛋疼的,只想一个IDE全都搞定。(顺便说一下,IDEA是可以处理Android工程的,而且跟Android studio基本没差异,装个插件就可以用了。)
在Github Flutter项目下还看到了一个关于此问题的issue:github.com/flutter/flu... 好像很多人遇到了类似问题。如果你用我的方法没有解决问题,可以过去看看有没有其他case跟你的相同。
解决办法
这个问题其实非常简单。先说操作,第一步,找到插件工程的sample工程中的build.gradle文件,如下图:

第二步:右键文件,选择Link Gradle Project。

齐活,等一下就会发现,sample里的android模块的代码和插件工程的android代码都可以正常索引了。
原理解析
为什么会这样呢,其实好理解。Android工程是用gradle工具来管理的,gradle工程需要执行完所有的gradle脚本以后,工程才能正常索引(类似于Linux系统的source),这也就是你每次打开一个Android项目或者其他gradle工程的时候,有个漫长的加载过程,其实就是gradle脚本在执行。而flutter项目是Flutter插件在管理,当你用IntelliJ IDEA打开flutter工程时,Gradle是不会工作的,只有你选择Link Gradle Project以后,才能触发gradle脚本执行。
那为什么一定要触发sample工程的gradle脚本执行才可以,而不是触发插件工程中的android模块的脚本执行呢?这就要看gradle脚本的代码了。玄机在sample工程的settings.gradle文件里:
scss
pluginManagement {
val flutterSdkPath = run {
val properties = java.util.Properties()
file("local.properties").inputStream().use { properties.load(it) }
val flutterSdkPath = properties.getProperty("flutter.sdk")
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
flutterSdkPath
}
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
}
include(":app")
这段代码是说,它要导入存于$flutterSdkPath/packages/flutter_tools/gradle这个目录下的插件工程,然后,这个插件在sample工程的app模块的build.gradle中,进行了应用:
bash
id("dev.flutter.flutter-gradle-plugin")
而这个插件里会做什么事情呢?我们最关心的一件事就是给工程导入几个jar包,(网上很多人解决这个错误都是找到jar包位置,手写的引用,这并不好。)导入后你就可以索引到io.flutter.*包下面的类了。这些逻辑在插件工程的android模块是没有的,所以你不能直接导入插件工程的android模块而是要导入sample工程的android模块。在你建立flutter应用工程时,也可以看到类似的脚本片段。同理,如果你想在flutter应用工程中编写Android代码,也只需要按上述方法操作一下即可。
这个小问题真的卡了我好久。碰见这种环境问题,真的头大,不会的人卡死,会的人又觉得这还能算一个知识点?希望帖子可以帮到遇到类似问题的小伙伴。如需转载,请标明出处,当然你不标我也没办法,哈哈哈。