新建的Flutter插件工程,无法索引andorid工程代码;无法索引io.flutter包下代码。

问题背景

我用的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代码,也只需要按上述方法操作一下即可。

这个小问题真的卡了我好久。碰见这种环境问题,真的头大,不会的人卡死,会的人又觉得这还能算一个知识点?希望帖子可以帮到遇到类似问题的小伙伴。如需转载,请标明出处,当然你不标我也没办法,哈哈哈。

相关推荐
程序员Ctrl喵13 小时前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter
前端不太难15 小时前
Flutter 如何设计可长期维护的模块边界?
flutter
小蜜蜂嗡嗡16 小时前
flutter列表中实现置顶动画
flutter
始持16 小时前
第十二讲 风格与主题统一
前端·flutter
始持16 小时前
第十一讲 界面导航与路由管理
flutter·vibecoding
始持16 小时前
第十三讲 异步操作与异步构建
前端·flutter
新镜17 小时前
【Flutter】 视频视频源横向、竖向问题
flutter
黄林晴17 小时前
Compose Multiplatform 1.10 发布:统一 Preview、Navigation 3、Hot Reload 三箭齐发
android·flutter
Swift社区18 小时前
Flutter 应该按功能拆,还是按技术层拆?
flutter
肠胃炎18 小时前
树形选择器组件封装
前端·flutter