首页 / 资讯中心 / 文章详情

Flutter 环境搭建全流程:从 flutter doctor 红叉到全绿

Flutter 环境搭建全流程:从 flutter doctor 红叉到全绿 ★ FEATURED ARTICLE
Flutter 环境搭建是很多人接触跨平台开发的第一道坎也是劝退率最高的一道坎。我见过太多人下载完 SDK兴冲冲敲了个flutter doctor然后对着满屏红叉开始怀疑人生——Android 工具链缺失、许可证没接受、模拟器连不上、Gradle 卡在下载十几分钟一动不动。其实把这件事拆开看它无非是四个相对独立的小工程SDK 本体、Android 工具链、设备连接、依赖下载通道。任何一个环节出问题表现出来都是环境搭不好但根因和解决路径完全不同混在一起排查只会越弄越乱。这篇内容按我自己的实操顺序来写把每一步在做什么、为什么这么做、哪里最容易翻车讲透。适合刚上手 Flutter 的同学也适合换了新机器、想一次性把环境理顺的老手。1. 动手之前先想清楚你装的到底是什么1.1 一次安装里其实藏着四层东西Flutter 的安装和装一个普通桌面软件完全不是一回事。它没有下一步下一步的安装向导本质是把一堆代码和预编译工具解压到某个目录然后让命令行能找到它。完整的一套环境至少包含四层缺任何一层都会在flutter doctor里体现出来。第一层是Flutter SDK 本体里面包含 Dart 运行时、编译前端、flutter命令行工具以及各平台的模板工程。第二层是Dart SDK这个不用你单独装它随 Flutter SDK 一起下发版本是绑定死的这也是为什么 Flutter 版本和 Dart 版本永远成对出现。第三层是Android 工具链包括 SDK 平台包、platform-tools、build-tools和命令行工具cmdline-tools。第四层是构建与依赖系统也就是 Gradle、Pub 包管理以及 iOS 侧必需的 CocoaPods。我见过最常见的情况是有人只解压了 SDK加了个 PATH就以为装完了然后编译 APK 报一堆错。这就像买了台打印机只把机器摆上桌驱动和纸都没准备然后怪打印机不好用。搞清楚这四层你在看flutter doctor输出时就不会一脸茫然——它其实是在逐层给你打体检报告每一行红叉都对应上面某一层。还有一个容易被忽略的点flutter命令行本身依赖 Git。在 Windows 上如果没有安装 Gitflutter命令会直接报错甚至闪退而不是给你一句友好的提示。所以 Windows 侧的必备前置其实是三样Git、JDK、Android SDK顺序不要搞反。1.2 版本渠道选错后面全是返工Flutter 有三条发布渠道stable、beta、master。新手一律用 stable没有例外。beta 和 master 分支上经常出现工具链半成品状态flutter doctor报的错可能是上游代码本身的 bug你去搜解决方案会搜到一堆驴唇不对马嘴的答案白白浪费时间。版本号这里有个现实问题Flutter 版本并不是越新越好。新版本会带来更高的 AGPAndroid Gradle Plugin和 Gradle 要求如果你接手的是一个老项目用最新版 Flutter 打开很可能直接构建失败。反过来如果一个项目模板是基于较新版本生成的你用一年前的 Flutter 去跑也会因为模板 API 差异报错。我一般会先看项目根目录下的几个关键文件来确定该用哪个版本pubspec.yaml里的environment.sdk约束、android/gradle/wrapper/gradle-wrapper.properties里的 Gradle 版本、android/settings.gradle里的 AGP 版本。这三者基本锁定了你需要的 Flutter 版本区间。下面这张表是我总结的大致对应关系具体数值仍然要以项目文件为准不要硬套Flutter 版本区间典型 AGP 版本建议 JDK典型 Gradle较早版本3.7 及以前7.x117.x中间版本3.10 - 3.167.3 - 8.1177.5 - 8.0较新版本3.19 之后8.x178.x这张表最实用的地方在于 JDK 那一列。很多人装完 Android Studio 就直接用系统里的 JDK 8结果 AGP 8 要求 JDK 17构建阶段报Unsupported class file major version这个错看起来跟 Java 毫无关系实际就是 JDK 版本不对。我的建议是干脆不要用系统 JDK直接指定 Android Studio 自带的 JBR 目录版本天然匹配省去一堆麻烦。2. 平台差异清单Windows 和 macOS 各自的前置准备2.1 Windows 上必须先装好的三样东西Windows 平台搭 Flutter 环境装之前先把三样东西备齐顺序建议是 Git → JDK → Android SDK。Git for Windows是硬性依赖。装的时候注意勾选把 Git 加入 PATH装完在命令行敲git --version能出版本号才算数。有些人用绿色版或者便携版 GitPATH 没配好flutter命令直接罢工报错信息还特别含糊这种坑排查起来非常耗时。JDK 17建议直接用 Android Studio 内置的那个路径一般在安装目录下的jbr文件夹里。如果你习惯单独装装完记得配置JAVA_HOME指向 JDK 根目录而不是bin目录——这是新手最高频的错误之一配成bin之后一切看起来都正常直到构建时才报奇怪的错。Android SDK我推荐通过 Android Studio 的 SDK Manager 装别自己去网上下压缩包手动解压。SDK Manager 会把目录结构、环境变量该有的东西都处理好而且能顺带把cmdline-tools装上。手动装的话cmdline-tools的目录层级特别讲究放错一层flutter doctor就识别不到。另外提醒一个 Windows 特有的坑开启开发者模式。Windows 对符号链接有限制Flutter 的某些插件在构建时会创建符号链接没开开发者模式会直接失败。开启方式是在系统设置的开发者选项里打开命令行里也可以直接跳到对应设置页。还有杀毒软件的实时扫描建议把 Flutter SDK 目录、Pub 缓存目录、Gradle 缓存目录都加进排除列表否则flutter pub get会慢到让你怀疑网络。2.2 macOS 上绕不开的 Xcode 与工具链macOS 侧多了一层 iOS 构建前置依赖也更重。Xcode 是必须的但不一定要装完整版如果你只做 Android 和 Web 开发装个 Command Line Tools 就够跑flutter doctor的 Android 部分了。要跑 iOS 模拟器就必须装完整 Xcode从 App Store 装装完还得手动执行一次初始化让它接受许可协议、下载必要组件。sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -license accept sudo xcodebuild -runFirstLaunch这三条命令我每次换机器都要跑一遍。第一条是把命令行工具的路径指向完整 Xcode如果你装过多个版本不指定就会用到旧的第二条接受许可协议不执行的话flutter doctor会提示 Xcode 未完全安装第三条是首次启动组件安装缺了它模拟器可能起不来。CocoaPods是 iOS 依赖管理只要你的项目引入了带原生代码的插件就必须有它。安装方式有两种用包管理器装或者用 Ruby 的 gem 装。较新的 macOS 系统自带 Ruby 版本可能偏老直接gem install有时会权限报错或者版本冲突我的习惯是用包管理器装省事且升级方便。装完敲pod --version验证一下如果提示 command not found多半是 PATH 没包含包管理器的安装路径。还有一点Apple Silicon 芯片的机器上某些老版本 CocoaPods 和 ffi 相关的依赖会编译失败遇到这种情况优先升级 CocoaPods 到较新版本比去折腾编译参数有效得多。2.3 安装目录怎么规划才不后悔目录规划这件事装的时候觉得无所谓用半年就知道疼了。我踩过的坑主要有三个路径带中文、路径带空格、路径太深。绝对不要放在带中文的路径下。Gradle 和部分构建工具对非 ASCII 路径处理得并不好报错往往发生在构建后期错误信息指向一个跟路径毫无关系的文件排查成本极高。同理路径里不要有空格虽然现在大部分工具已经支持但总有那么一两个环节会掉链子。我的推荐做法是在用户目录下建一个统一的开发目录比如~/dev/然后把 SDK 放在~/dev/flutter。这个结构的好处是路径短、全英文、层级浅命令行里敲起来也快。Windows 上更要避开C:\Program Files这类受保护目录。有些工具在构建时需要在 SDK 目录内写缓存文件权限不足会静默失败。放在用户目录下最稳妥。另外 SDK 目录一旦定下来就别随便挪环境变量、IDE 配置、项目里的本地路径引用都会记录这个位置挪一次要改一圈。还有个小细节SDK 目录建议留足空间。Flutter SDK 本身加上各版本缓存、Android SDK、Gradle 缓存、Pub 缓存一套下来轻松吃掉几十 G。我之前有台机器系统盘只剩十来个 G构建到一半报磁盘空间不足错误信息还特别隐晦找了半天才发现是空间问题。3. 从解压到 doctor 全绿完整实操流程3.1 下载、解压与环境变量配置从官方渠道下载对应平台的压缩包。Windows 下是 zipmacOS 下可以选择 zip 或者压缩包格式我倾向于统一用压缩包好处是目录结构可控、便于多版本共存坏处是需要自己配环境变量不过也就几步的事。解压到前面规划好的目录然后配置环境变量。Windows的操作路径是系统属性 → 高级 → 环境变量在用户变量的Path里新增一条指向flutter\bin。注意是bin目录不是 SDK 根目录。配完必须重开一个命令行窗口已经打开的窗口读不到新环境变量这个细节坑过不少人。macOS修改 shell 配置文件较新的系统默认是 zsh编辑~/.zshrcexport FLUTTER_HOME$HOME/dev/flutter export PATH$FLUTTER_HOME/bin:$PATH保存后执行source ~/.zshrc让配置生效。验证方式很简单敲flutter --version能出版本号说明 PATH 对了。第一次执行flutter命令时它会自己做一些初始化工作下载 Dart SDK 和工具快照这个过程可能持续几分钟属于正常现象不要以为卡死了就 CtrlC。这里插一句关于镜像源的事。首次初始化要下载不少东西如果你的网络环境访问默认源速度不理想flutter命令会长时间停在某个百分比。这种情况可以配置镜像地址来提速具体写法放在第 4.1 节讲这里先记住第一次跑 flutter 会比较慢是预期行为。环境变量配好后跑一次flutter doctor -v-v是 verbose会输出详细路径信息。这一步不需要全绿先看它能不能正确识别 SDK 位置、Dart 版本、以及它认为你的 Android 工具链在哪。记下它报的 Android SDK 路径后面配置要用到这个信息。3.2 Android 工具链、SDK 与许可证Android 侧的配置是整个流程里最琐碎的一段也是红叉最集中的地方。先确认 SDK 路径。在 Android Studio 的 SDK Manager 里能看到 SDK Location通常是用户目录下的Android/Sdk。如果flutter doctor报Unable to locate Android SDK就是它没找到这个位置。解决方式有两种一是设置环境变量ANDROID_HOME指向该目录二是在命令行里显式指定flutter config --android-sdk /path/to/Android/Sdk第二种方式优先级更高也更不容易被其他环境干扰我一般用这种。接下来装必要的 SDK 组件。在 SDK Manager 的 SDK Tools 标签页里至少勾选这几项Android SDK Command-line Tools、Android SDK Platform-Tools、Android SDK Build-Tools以及至少一个SDK Platform对应某个 Android API 版本。其中Command-line Tools 必须有它是flutter doctor --android-licenses的前提缺了它就会报cmdline-tools component is missing。装完命令行工具后执行许可证接受flutter doctor --android-licenses这个命令会连续弹出若干条许可协议一路敲y回车到底。有时会提示某条协议已经接受过跳过即可。跑完之后再执行flutter doctorAndroid 那一行通常会从红变绿或者变成提示级的黄。如果这里报Android license status unknown先别急着找别的方案九成是因为cmdline-tools没装或者装错了位置。它的正确位置是SDK 目录/cmdline-tools/latest/bin注意latest这一层不能少很多人解压时直接把bin放到cmdline-tools下面导致识别失败。JDK 这块前面提过如果构建时报 Java 版本相关错误可以显式指定flutter config --jdk-dir /path/to/Android Studio/jbr用 Android Studio 自带的 JBR版本匹配问题基本一次性解决。3.3 创建项目并跑通第一个界面环境配好之后创建一个项目验证整条链路。建议第一次创建时指定一个明确的平台减少无关干扰flutter create --platformsandroid,ios demo_app cd demo_app flutter devicesflutter devices会列出当前可用的设备。如果列表为空说明既没有启动模拟器也没有连接真机这时候可以先创建一个模拟器或者直接连一台开了调试模式的安卓机。连真机有几个容易疏忽的点USB 调试模式要在开发者选项里手动打开连接后手机上会弹一个允许调试的授权框必须点允许而且建议勾选始终允许Windows 上有时还需要装厂商的 USB 驱动否则设备管理器里能看到设备但flutter devices识别不到。macOS 相对省心插上一般就能认。设备就绪后执行flutter run第一次运行会比较慢因为它要下载 Gradle、构建依赖、编译 Dart 代码。看到计数器界面出来说明整条链路通了。如果你的目标平台是 iOS第一次运行会触发 CocoaPods 安装耗时更长中间可能出现依赖拉取失败重试一次通常能过。我一般还会顺手验证一下 Web 和桌面端命令是flutter run -d chrome或者指定桌面对应的设备 ID。这样做的好处是把环境的能力边界摸清楚以后需要切平台时心里有数。不过桌面端和 Web 端需要额外开启支持命令是flutter config --enable-web之类的开关具体看当前版本的支持情况。4. 卡在下载和构建镜像、缓存与依赖提速4.1 镜像源配置的两种写法下载慢是环境搭建阶段最普遍的困扰表现为flutter pub get长时间无响应、Gradle 卡在Downloading不动、首次运行几十分钟没进展。这些本质上是同一种问题的不同表现依赖从较远的源拉取链路质量不稳定。Flutter 生态的依赖有三条主要通道Pub 包仓库、Flutter 自身产物存储、以及 Maven 仓库Gradle 拉取 Android 依赖用。前两条可以通过环境变量配置镜像地址来提速export PUB_HOSTED_URLhttps://可用的镜像域名 export FLUTTER_STORAGE_BASE_URLhttps://可用的镜像域名Windows 下在系统环境变量里新建这两项即可。具体域名请以你所在网络环境下实际可访问的镜像服务为准不同区域的镜像地址会变写死了反而容易失效。配置完成后缓存清一下再重新拉取flutter clean flutter pub get第三条通道 Maven 仓库配置位置在 Gradle 的初始化脚本里。我习惯在用户目录下建一个全局的init.gradle对所有项目生效省得每个项目改一遍// ~/.gradle/init.gradle allprojects { repositories { maven { url https://镜像域名/repository/google } maven { url https://镜像域名/repository/public } maven { url https://镜像域名/repository/gradle-plugin } google() mavenCentral() } }这段配置的作用是把镜像源排在官方源前面镜像里有的优先从镜像拿镜像里没有的再回落到官方源。顺序很重要写反了就没提速效果。同样域名部分替换成实际可用的镜像服务地址。4.2 Gradle 与 Pub 缓存的管理搞明白缓存放在哪能帮你省下大量重复下载的时间也能在你遇到明明改了配置却不生效时提供一条明确的排查路径。Pub 缓存默认在用户目录下的.pub-cache所有通过 pub 下载的包都存在这里。删掉它不会有损失下次pub get会重新拉但如果你网络不好删之前想清楚。想清理单个包用flutter pub cache repair这个命令会把缓存里的包重新校验一遍遇到包内容损坏的情况很管用。Gradle 缓存在用户目录下的.gradle这里有全局缓存和各版本的 Gradle 发行版。其中caches/modules-2存依赖wrapper/dists存各个 Gradle 版本。如果某个版本的 Gradle 下载到一半断了可能留下一个损坏的目录后续构建会一直报奇怪的错。判断方法很直接去wrapper/dists里看对应版本目录的体积正常应该是几十兆如果只有几 K那就是没下完整删掉重来即可。Flutter 自身的产物缓存在 SDK 目录的bin/cache。有时候构建报错和缓存有关可以执行flutter precache重新拉取或者执行flutter clean清项目级缓存。如果遇到Waiting for another flutter command to release the startup lock这类提示说明有个锁文件没释放直接删掉bin/cache/lockfile再执行就好。这个锁在异常中断后经常残留属于高频问题。另外项目内的android/.gradle和ios/Pods也是缓存遇到构建诡异失败时把这两个目录连同build一起删掉再重新构建能解决相当一部分疑难杂症。我在排查时会按项目内缓存 → 全局缓存 → 重装依赖这个顺序逐级放大很少需要走到最后一步。5. 常见问题与排查实录5.1 flutter doctor 报错速查表flutter doctor是环境体检工具但它给的错误信息有时非常简略第一次看基本看不懂。下面这张表是我这些年攒下来的对照关系按出现频率排序报错关键信息真实原因处理方式cmdline-tools component is missing命令行工具未安装或目录层级不对在 SDK Manager 勾选 Command-line Tools确认cmdline-tools/latest/bin结构Android license status unknown许可证未接受执行flutter doctor --android-licenses逐条接受Unable to locate Android SDK未设ANDROID_HOME或路径错误用flutter config --android-sdk显式指定Xcode not fully installed许可协议未接受或组件未装执行xcodebuild -license accept与-runFirstLaunchCocoaPods not installedPod 未安装或不在 PATH用包管理器安装验证pod --versionNo devices found模拟器未启动或真机未授权启动模拟器或在手机上确认调试授权弹窗Unsupported class file major versionJDK 版本与 AGP 不匹配用flutter config --jdk-dir指向内置 JBRWaiting for another flutter command锁文件残留删除bin/cache/lockfile这张表覆盖了我遇到的八成以上情况。剩下两成通常是网络或磁盘问题报错信息五花八门但排查思路是一致的看报错里提到的路径去那个路径确认文件是否存在、体积是否正常。5.2 模拟器与真机识别不出来设备识别问题属于第二高频的困扰特征是flutter doctor全绿但flutter devices空空如也。模拟器侧最常见的原因是启动失败但窗口没报出来。Windows 上如果没开硬件虚拟化在 BIOS 里设置模拟器会启动后立刻退出。判断方法是在 Android Studio 的虚拟设备管理器里手动启动一次看有没有明确的错误提示。另一类问题是模拟器的镜像文件损坏表现是一直卡在开机动画这种情况删掉重建一个虚拟设备最干脆。真机侧排查顺序我一般是这样的先在手机上确认开发者选项和 USB 调试都开着然后拔插一次数据线看手机上有没有授权弹窗再看命令行adb devices的输出如果这里能看到设备但flutter devices看不到通常是 Flutter 侧的问题重启一下 adb 服务如果adb devices显示unauthorized说明授权没通过需要在手机上点允许或者到开发者选项里撤销 USB 调试授权后重新插拔。还有一类比较隐蔽的数据线只能充电不能传数据。这种线插上去手机只会显示充电设备管理器里看不到任何变化。换一根确定能传数据的线问题当场解决。我遇到过两次每次都是排查了一大圈才想起来换线。macOS 上还有个小坑iOS 模拟器必须通过 Xcode 或者命令行open -a Simulator启动光在命令行里flutter emulators看到列表不代表它已经跑起来了。5.3 升级、降级与多版本共存单版本用久了总会有需要切换的时候比如老项目要求旧版本新项目想用新特性。Flutter 自带的渠道切换命令是flutter channel切换后执行flutter upgrade拉取对应分支的最新代码。这种方式的好处是不用额外工具坏处是切换成本高每次都要重新拉代码、重新预热缓存而且同一时间只能有一个版本。如果要频繁切换建议用版本管理工具它能在同一台机器上维护多个 Flutter 版本并为每个项目指定使用哪个版本。这类工具的配置方式是在项目根目录放一个版本声明文件工具检测到就会自动切换到对应版本。用起来的感受是项目一打开版本就对了省去大量手动切换的心智负担。升级前我有个固定动作先把当前版本的路径记下来或者干脆复制一份 SDK 目录做备份。因为升级到新版本后旧项目可能需要改配置而回退到旧版本又要重新下载有备份就能秒切换。这个习惯帮我省下过至少半天时间。小版本迭代也值得注意。flutter upgrade拉的是当前渠道的最新代码有时候一次升级会跨好几个版本中间可能引入不兼容变更。我的做法是先在一个新建的空项目上跑一遍升级后的flutter doctor和flutter run确认基础链路没问题再去升级业务项目。6. 一些用久了才会有的体会环境这件事第一次搭的时候花两天很正常第二次一小时第三次二十分钟差距不在手速在于你知道哪里会出问题、出问题该看哪。我现在换机器基本是一次成型靠的就是前面那几张表和对目录结构的固定习惯。真正让我吃过亏的反而不是技术问题而是图省事。比如把 SDK 放在带中文的桌面路径下当时能跑三个月后某个插件构建失败报错信息指向一个莫名其妙的文件找了一下午才发现是路径编码问题比如为了省空间没给 Gradle 缓存留够地方构建到九成报错错误信息还跟空间无关。这些坑的共同点是装机时省下的五分钟后面要用五个小时还回来。最后分享一个我觉得最有价值的小习惯环境配好后把关键的配置项和版本号记一份包括 Flutter 版本、Dart 版本、JDK 路径、Android SDK 路径、Gradle 版本、以及你改过的所有环境变量。这份记录在新机器复现、协作排查、以及半年后自己回看时价值远超记录它花的那几分钟。
阅读完成 · 觉得有帮助?
咨询建站