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

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

相关推荐
LinXunFeng16 小时前
Flutter 拖拉对比组件,换装图片前后对比必备
前端·flutter·开源
2501_9197490316 小时前
配置flutter鸿蒙的环境和创建并运行第一个flutter鸿蒙项目【精心制作】
flutter·华为·harmonyos
YUFENGSHI.LJ17 小时前
Flutter 如何使用fvm进行多项目sdk管理
flutter
开心-开心急了19 小时前
关于Flutter与Qt for python 的一些技术、开源、商用等问题
开发语言·python·qt·flutter
猫林老师1 天前
Flutter for HarmonyOS开发指南(四):国际化与本地化深度实践
flutter·华为·harmonyos
猫林老师1 天前
Flutter for HarmonyOS 开发指南(一):环境搭建与项目创建
flutter·华为·harmonyos
sunly_2 天前
Flutter:视频预览功能
javascript·flutter·音视频
勤劳打代码2 天前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
2501_915918412 天前
Flutter 加固方案对比与实战,多工具组合的跨平台安全体系(Flutter App 加固/IPA 成品混淆/Ipa Guard CLI/自动化安全流程)
安全·flutter·ios·小程序·uni-app·自动化·iphone
Bryce李小白2 天前
Flutter中mixing的原理及应用场景
flutter