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

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

相关推荐
农夫三拳_有点甜3 小时前
Flutter Expanded 组件总结
flutter
火柴就是我4 小时前
跟着官方demo 学flame 之 word 坐标系以及Camera的一些属性
flutter
新镜4 小时前
【Flutter】drag_select_grid_view: ^0.6.2 使用
flutter
程序员老刘5 小时前
Google突然“变脸“,2026年要给全球开发者上“紧箍咒“?
android·flutter·客户端
鹏多多.9 小时前
flutter-使用fluttertoast制作丰富的高颜值toast
android·前端·flutter·ios
新镜1 天前
【Flutter】RefreshIndicator 无法下拉刷新问题
flutter
星秋Eliot1 天前
Flutter的三棵树
前端·flutter
humiaor1 天前
Flutter之riverpod状态管理Widget UI详解
flutter·consumer·widget·hooks·provider·riverpod·hookwidget
农夫三拳_有点甜1 天前
Flutter Stack 组件总结
flutter
MaoJiu1 天前
Flutter混合开发:在iOS工程中嵌入Flutter Module
flutter·ios