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

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

相关推荐
阅文作家助手开发团队_山神1 小时前
第三章: Flutter-quill 数据格式Delta
flutter
阅文作家助手开发团队_山神1 小时前
第二章:Document 模块与 DOM 树详解
flutter
程序员老刘2 小时前
20%的选择决定80%的成败
flutter·架构·客户端
肥肥呀呀呀10 小时前
flutter 中Stack 使用clipBehavior: Clip.none, 超出的部分无法响应所有事件
flutter
SY.ZHOU10 小时前
Flutter如何支持原生View
flutter
sg_knight10 小时前
Flutter嵌入式开发实战 ——从树莓派到智能家居控制面板,打造工业级交互终端
android·前端·flutter·ios·智能家居·跨平台
张风捷特烈12 小时前
每日一题 Flutter#4 | 说说组件 build 函数的作用
android·flutter·面试
小镇梦想家1 天前
鸿蒙NEXT-Flutter(2)
flutter
至善迎风1 天前
一键更新依赖全指南:Flutter、Node.js、Kotlin、Java、Go、Python 等主流语言全覆盖
java·flutter·node.js