很多人学 Flutter,第一个遇到的拦路虎不是 Widget 嵌套,也不是状态管理,而是开发环境初始化。我见过不少同学在群里问“为什么我的 flutter doctor 一片红”,最后装到一半就放弃了。这篇内容把我从零初始化 Flutter 开发环境的完整过程拆开,从系统准备、SDK 下载、镜像配置,到 Android 工具链、编辑器插件,再到第一个项目跑起来的完整链路,一次讲清楚。适合两类人:一是刚接触 Flutter、还不清楚该装什么的纯新手;二是装过但环境不干净、想彻底重新整理一遍的老手。
1. 初始化前先想清楚:Flutter环境到底包含几条链
很多教程上来就让你下载 SDK,双击解压,然后加 PATH,看起来很简单。但实际装完你会发现,flutter doctor 依然给你列出四五个红叉。问题出在认知上:Flutter 不是一个“装完即用”的独立软件,它是一条完整的工具链,每个环节都缺一不可。
- Flutter SDK 本体:包含 Dart SDK、Flutter 引擎、命令行工具
flutter,这相当于发动机。 - Android 构建链:JDK + Android SDK + Gradle。你要跑 Android 应用,就必须有这套东西,相当于变速箱和轮胎。
- 开发工具:VS Code 或 Android Studio,加上对应的 Flutter 插件,这是你的方向盘和仪表盘。
三者缺一不可。只装 SDK 不做构建链,flutter create 能成功,但 flutter run 一到 Gradle 阶段就会扑街;只装构建链不装编辑器,你连代码都写不了几行。
还有一个隐形环节是设备,包括 Android 模拟器、Chrome 浏览器,或者一台开了开发者模式的真机。这些不是必需项,但直接影响你调试的体验。很多人环境“装好了”却看不到设备,问题往往出在 Android 工具链没有彻底跑通。
搞清这个整体结构后,再往下走就不会迷茫了。接下来我会按正常安装顺序,把每一步怎么操作、为什么这么做、踩了哪些坑都写清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的系统准备:Git与JDK的细节
2.1 为什么非要先装 Git
Flutter 官方文档把 Git 列为必装项。原因不只是版本管理,更核心的是 Flutter 的依赖拉取机制会调用 Git 命令。flutter pub 在解析某些 Git 源依赖时,如果没有 Git 环境,会直接报 “Unable to locate git executable” 之类的错误。Windows 用户建议装 Git for Windows,安装时一路默认即可,但有几个选项要注意:
- 在“Adjusting your PATH environment”这一步,选 Git from the command line and also from 3rd-party software。
- 换行符转换选默认的 “Checkout Windows-style, commit Unix-style line endings” 就行,Flutter 项目本身不涉及混用仓库。
- 装完在终端里执行
git --version能正常输出版本号,就说明没问题。
macOS 用户可以直接用 Xcode Command Line Tools 附带的 Git,执行 xcode-select --install 即可。也可以走 Homebrew 装新版 Git,两者都可以,完全看个人习惯。注意不要在 Windows 上用 winget 装 Git 后忘记重启终端,环境变量不会自动刷新,很多人卡在这一步。
2.2 JDK 版本选择与配置误区
JDK 是 Flutter 做 Android 构建时绕不开的依赖。这里有个容易踩的坑:不是越新越好。 Flutter 官方对 Java 版本有明确建议,目前稳定版推荐 JDK 17。JDK 21 甚至更新的版本,在 Gradle 兼容性上偶尔会出现奇怪的问题,尤其是旧项目迁移上来的场景。
如果你选择了安装 Android Studio,其实可以跳过手动装 JDK 这一步,因为 Android Studio 自带了一个 JetBrains Runtime(JBR),它就是完整可用的 JDK 环境。flutter doctor 检测到 Android Studio 时,会自动定位到它内置的 JDK,不需要额外配置 JAVA_HOME。
但如果你是“纯命令行流派”,不打算装 Android Studio,那就手动装 JDK 17,并配置好两个环境变量:
code复制JAVA_HOME=C:\Program Files\Java\jdk-17
PATH=%JAVA_HOME%\bin;%PATH%
macOS 同理,在 ~/.zshrc 里加上:
code复制export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH=$JAVA_HOME/bin:$PATH
我的经验是:新手老老实实让 Android Studio 来管理 JDK,省心很多。 手动管理 JAVA_HOME 最大的风险是系统里存在多个版本,Gradle 不知道用哪个,最后报 “Unsupported class file major version” 这类错误,排查起来特别费时间。
2.3 系统级注意点:磁盘路径和空间
Flutter SDK 解压后的体积大约 2 到 3 GB,Android SDK 加上模拟器镜像轻松超过 10 GB,这还不包括后续 Gradle 缓存和依赖下载。建议给开发盘预留至少 20 GB 空间。另外,解压路径绝对不能包含中文和空格,这是老生常谈,但真的有人栽在这里。比如 D:\软件\flutter 这种路径,在 Gradle 脚本里很容易触发编码或路径解析问题,建议统一用 D:\dev\flutter 这样的纯英文路径。
3. Flutter SDK 下载与国内镜像配置实操
3.1 版本选择与下载方式
去 Flutter 官网下载区选择对应操作系统的 stable 版本压缩包即可。Windows 下载 zip,macOS 下载 zip,然后解压到刚才说的纯英文目录。
这里有个容易被忽略的点:下载页会区分 Windows / macOS / Linux,但 macOS 还细分了 Intel 芯片和 Apple Silicon 芯片的包。 M 系列芯片如果下错了 x64 版本,虽然能启动,但每次构建都会走 Rosetta 转译,明显偏慢。正确做法是在“About This Mac”里确认芯片型号,再选择对应的 arm64 版本。
如果你追求更灵活的管理方式,也可以用 Homebrew 安装:
bash复制brew install --cask flutter
但这种方式默认装的是最新 stable,写这篇内容的时候版本已经到了 3.27 系列。个人建议新手以官网 zip 包为准,路径可控,也方便以后升级切换版本。
3.2 配置官方中国镜像环境变量
Flutter 官方文档为中国开发者提供了一套镜像地址,配置方式非常简单,设置两个环境变量即可。这是官方支持的做法,也是 Flutter 团队明确推荐给国内开发者的方案,放心用。
Windows 设置用户环境变量:
code复制变量名:PUB_HOSTED_URL
变量值:https://pub.flutter-io.cn
变量名:FLUTTER_STORAGE_BASE_URL
变量值:https://storage.flutter-io.cn
macOS / Linux 在 ~/.zshrc 或 ~/.bashrc 里追加:
bash复制export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH="$PATH:$HOME/development/flutter/bin"
这两个变量一个负责 Dart 包管理仓库,一个负责 Flutter 引擎和资源的下载。必须在解压后、第一次执行任何 flutter 命令之前设置好,否则 SDK 初始化下载的引擎二进制会走默认地址,速度慢且容易超时,后面还得重新清缓存再来一遍。
配置完成后,打开新的终端窗口,执行:
bash复制flutter --version
第一次运行会做 SDK 的初始化和 Dart SDK 编译,需要等一两分钟。看到版本号正常输出后,再执行:
bash复制flutter doctor
这一步会列出整个环境的健康状况。你先不用管一片红绿的输出,先继续往下装 Android 工具链,装完再回头看,很多报错会自己消失。
4. Android 工具链:Android Studio 与 SDK 安装
4.1 Android Studio 的安装策略
如果你定位是纯 Flutter 开发者,不做原生 Android 开发,“轻量”和“完整”之间怎么选?我的建议是:首装用 Android Studio,哪怕你以后天天用 VS Code。 原因很简单:Android Studio 安装包自带 SDK Manager、AVD Manager、模拟器镜像管理这些全套工具,比手动装 SDK 组件省事得多。
安装过程有几个细节:
- 安装到路径选择时,同样避免中文和空格路径。
- 首次启动会让你选择 UI 主题,随便选,后面能改。
- 如果之前装过旧版,会提示导入旧配置,建议选 “Do not import settings”,避免旧配置干扰新版本。
装完后先不要急着建项目,直接打开 SDK Manager。在欢迎界面的右下角点击 Configure,或者进入任意项目后点击工具栏上的 SDK Manager 图标。
4.2 SDK Platforms 和 SDK Tools 怎么选
SDK Manager 里有两个核心 Tab:SDK Platforms 和 SDK Tools。
在 SDK Platforms 里,建议勾选“Android SDK Platform 35”或当前最新稳定版本对应的平台。不需要把所有 API Level 都装一遍,只装你将要构建的目标版本就够。还有钩子选项 “Show Package Details” 可以看到具体组件,如果你打算用模拟器,就顺手勾选对应 API Level 的 Google APIs 镜像。
SDK Tools 里重点关注几个组件:
- Android SDK Build-Tools:默认会装一个版本,保持勾选。
- Android SDK Command-line Tools(latest):这个必须装。很多命令行的 Gradle 构建会调用它,不装会报 “SDK command-line tools component is missing”。
- Android Emulator:跑模拟器必须。
- Android SDK Platform-Tools:包含 adb 等工具,真机调试必须。
安装完这些后,你会在 SDK Manager 顶部看到 SDK 的位置,例如 Windows 下是 C:\Users\你的用户名\AppData\Local\Android\Sdk。记下这个路径,后面可能用到。
4.3 创建模拟器与真机前置准备
打开 AVD Manager(在欢迎页 Configure 里,或者工具栏图标),点击 Create Virtual Device。设备建议选 Pixel 系列,镜像推荐下载对应的 Google APIs 版本,不用刻意追求最新系统版本,API 34 或 35 都够用。
模拟器创建完成后,点击启动。首次冷启动会比较慢,这是正常的,别怀疑自己装错了。等待几秒钟到十几秒,看到桌面加载出来就算成功。
真机调试的话,Android 手机需要两步:在“设置-关于手机”里连点版本号开启开发者模式,然后在“开发者选项”里打开 USB 调试。数据线插上后,手机端会弹出允许 USB 调试的授权框,点允许即可。执行 adb devices 能看到设备就算连接成功。
这里还要补一个非常常见的报错来源:如果你手动设置了 ANDROID_HOME 环境变量,它的路径必须和 SDK Manager 里的路径完全一致。 不一致时,flutter doctor 会提示 “Unable to locate Android SDK”。不确定的情况下,干脆别设这个环境变量,Android Studio 和 Flutter 在绝大多数场景下都能自动定位 SDK。
5. 编辑器与插件:VS Code 和 Android Studio 的分工
5.1 VS Code 插件配置
VS Code 走的是轻量路线,启动快,内存占用低。需要装两个核心插件:Flutter 和 Dart。在扩展市场搜 “Flutter”,第一个就是,装上 Flutter 插件时 Dart 插件会被自动带出来。
装完插件后,必须手动指定 Flutter SDK 路径,否则插件不知道去哪里找 SDK。操作路径:打开命令面板(Ctrl+Shift+P),执行 “Flutter: Change SDK Path”,然后定位到之前解压的 Flutter 目录。确认后,右下角会提示 “Reload Window”,重启编辑器即可。
VS Code 对 Flutter 的支持已经足够日常使用:断点调试、热重载、代码补全、错误提示都很完善。唯一的短板是在编辑原生 Kotlin / Java 代码时体验不如 Android Studio,但这对纯 Flutter 项目影响不大。
5.2 Android Studio 插件配置
Android Studio 第一次安装后默认不会装 Flutter 插件。打开 Settings -> Plugins,搜“Flutter”,安装后重启。插件同样会自动拉起 Dart 插件。这里有一个细节:Android Studio 里的 Flutter 插件默认会识别系统 PATH 里的 Flutter SDK,如果你用的是镜像配置后的自定义路径,建议在 Settings -> Languages & Frameworks -> Flutter 里检查一下 SDK 路径是否自动匹配。
两个编辑器之间没有绝对的“唯一解”,我更推荐的分工方式是:
- 日常 Dart 业务代码:用 VS Code,轻快、顺手。
- 需要写原生平台代码、看 Gradle 日志、调模拟器配置:切到 Android Studio。
每次切换编辑器不用重新配置环境,同一个项目用哪个打开都一样,只是推荐的场景不同。不过对新手,我还是建议至少前两周用 Android Studio 学习,它不是最轻的,但报错信息展示更直观,尤其是 Gradle 构建出错时,能直接看可视化日志。
5.3 热重载的基本操作
热重载是 Flutter 开发的灵魂,也是新手最容易忽略的“爽点”。运行 flutter run 后,在终端按小写 r 键触发热重载,应用状态尽量保留,代码修改几乎即时生效;按大写 R 键触发热重启,整个应用重启,状态清空。
如果你用 VS Code 调试模式运行,工具栏上会出现热重载图标,功能和终端按 r 完全一致。在浏览器端调试时,我会单独提醒一个问题:热重载后浏览器有可能不刷新,这个放到最后的报错排查里细说。
6. flutter doctor 全项排查:把红色报错逐个清零
6.1 看懂每一行的输出
flutter doctor 是环境初始化的“体检报告”,每一行都有明确含义。我整理了一张表格,对照着看会省很多力气:
| 检查项 | 通过标准 | 常见失败原因 |
|---|---|---|
| Flutter | 版本号和渠道正常显示 | PATH 配置有误、未重启终端 |
| Android toolchain | Android SDK 路径正确,无报错 | 未安装 Android Studio / SDK、没有配置 licenses |
| Chrome | Chrome 可执行文件能被找到 | 未安装 Chrome,或版本过旧 |
| Android Studio | 已安装且 Flutter 插件存在 | 插件未安装、SDK 路径未匹配 |
| VS Code | 已安装且 Flutter 插件存在 | 插件未安装、未指定 Flutter 路径 |
| Connected device | 至少有一个设备,或显示 “No devices available” | 模拟器未启动、真机未开启调试 |
| Network | 镜像地址可访问 | 镜像环境变量未配置或写错 |
其中最容易出红叉的是 Android licenses 未接受。执行:
bash复制flutter doctor --android-licenses
之后一路输入 y 回车,把授权全部确认掉,这是很多报错能瞬间消失的原因。
6.2 Gradle 相关报错:新版 Flutter 的迁移坑
环境初始化里最折磨人的报错通常来自 Gradle。热搜词里频繁出现的两条,我单独拿出来说。
第一条是 “You are applying Flutter's main Gradle plugin imperatively using the apply script method”。这个报错出现在你拿着旧项目或旧模板,用新版 Flutter 打开时。Flutter 3.16 之后把 Gradle 插件声明方式从传统的 apply plugin: 迁移到了 plugins DSL,旧脚本和新工具链不兼容。
解决方案是手动改三处文件:
第一处,android/settings.gradle,在 pluginManagement 块里加上 Flutter 插件加载器:
groovy复制pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.1.0" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}
第二处,android/build.gradle,删除原有的 classpath "com.android.tools.build:gradle:..." 相关声明,变成:
groovy复制allprojects {
repositories {
google()
mavenCentral()
}
}
第三处,android/app/build.gradle,把顶部的 apply plugin: 'com.android.application' 和 apply plugin: 'kotlin-android' 替换为:
groovy复制plugins {
id "com.android.application"
id "kotlin-android"
}
这三处是配套的,漏改任何一处都会在构建时报错,而且报错信息非常容易让人误以为是网络问题。
第二条是 “Error resolving plugin [id: 'dev.flutter.flutter-plugin-loader', version: ...]”。这个报错的根因大概率是 Gradle 插件仓库拉不到对应插件,说白了是仓库地址太慢。在 settings.gradle 的 pluginManagement.repositories 里加上国内镜像仓库:
groovy复制repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
mavenCentral()
gradlePluginPortal()
}
同理,项目根目录的 build.gradle 里 allprojects.repositories 也建议加上这三行镜像地址。修改后重新同步 Gradle,一般能顺利通过。
6.3 Network 检查和缓存清理
如果你的 flutter doctor 在网络那一项打了叉,先检查两个环境变量是否写对,再检查是否配置完没重启终端。镜像地址写错一个字符都会导致访问失败。
如果确认环境变量没问题,仍拉取超时,可以清一遍 Flutter 的缓存重新初始化:
bash复制flutter clean
flutter pub cache repair
在 Windows 上,还有个大杀器是 Gradle 缓存目录。默认在 C:\Users\你的用户名\.gradle\wrapper\dists,如果之前构建到一半失败过,残留的损坏文件会反复报错。稳妥起见,可以删除整个 .gradle 文件夹,下次构建会自动重新下载。这个操作不伤项目,最多就是首次构建慢一点。
6.4 一个容易被忽略的 IDE 版本问题
flutter doctor 报 “Android Studio not found”,但明明装了 Android Studio,这种诡异情况通常有两个方向。
第一个是 Android Studio 版本过旧,新版 Flutter 检测不到。把 Android Studio 升到最新稳定版基本能解决。
第二个是插件索引问题。检查 Android Studio 的 Settings -> Languages & Frameworks -> Android SDK,如果 SDK Location 显示为空或错误,手动指定到 SDK 管理器里的真实路径,然后重启 Android Studio。很多时候把 flutter doctor 可视化输出的红叉对应到具体软件设置里,就能发现问题所在。
7. 创建并跑通第一个Flutter项目:常见报错与验证
环境全部通过后,就该创建项目验证整个链路了。在终端执行:
bash复制flutter create my_app
cd my_app
flutter run
flutter create 会自动生成 Android、iOS、Web 等多个平台的工程骨架。首次运行会自动拉取 Gradle 依赖,会因为镜像速度不同花费几分钟到十几分钟不等。在 Android 模拟器里看到默认的计数器页面动起来,你的开发环境初始化就算彻底成功了。
这个过程中还有三个高频问题值得提前打预防针。
第一个是浏览器调试热重载后不更新。 如果你用 flutter run -d chrome 调试,改完代码按 r,可能会发现浏览器页面没反应。这不是热重载失效,而是浏览器端的连接可能已经断了。最常见的一个原因是你修改了入口文件 main.dart 里的 main() 函数,这类代码改动需要热重启而不是热重载,按大写 R 试试。如果重启也不行,关掉浏览器标签页重新 flutter run 即可。另一个原因是浏览器缓存,在开发者工具里勾选 Disable cache 会有帮助。
第二个是模拟器冷启动特别慢。 这不一定是配置问题,第一次启动模拟器需要做系统初始化和软件渲染,2 到 5 分钟都是正常区间。如果之后每次启动都慢,可以考虑调整模拟器选项里的 Graphics,从 Automatic 换成 Hardware,或者加内存和存储空间。
第三个是 flutter build apk 首次打包非常慢。 第一次打包 Gradle 要下载大量依赖,进度条可能长时间停在同一位置。只要你接入了镜像仓库,不用担心,等就行。如果已经卡了半个小时以上,再考虑中断后清缓存重试。
最后,关于网上时不时出现的“Flutter 是不是要凉了”讨论,我个人的判断是:看一个技术栈是否值得投入,看它的生态更新和维护力度就好。只要你打开官网发现 SDK 还在正常发版、社区还在持续活跃,这条路就值得走。环境初始化只是第一步,把它踩实了,后面写业务逻辑、调 UI、打装机包都会顺很多。
