安装fvm
fvm 是 Flutter Version Management 的缩写,是一个用于 管理多个 Flutter SDK 版本 的工具。
当你有多个 Flutter 项目、每个项目可能使用不同版本的 Flutter SDK 时,fvm 可以帮你:
| 功能 | 说明 |
|---|---|
| 📌 项目锁定版本 | 为每个项目锁定独立的 Flutter 版本(项目本地 .fvm/flutter_sdk) |
| 🔄 多版本共存 | 不同项目可使用不同的 SDK 版本,而不会互相干扰 |
| ⏬ 快速切换版本 | 快速安装、切换 Flutter SDK 版本 |
| 🧼 避免污染全局 | 不影响你的全局 flutter 安装 |
brew tap leoafarias/fvm
brew install leoafarias/fvm/fvm
# 验证fvm 下载成功
fvm --version
使用fvm下载SDK
下载 stable 版本
fvm install stable
下载指定版本:
fvm install 3.0.1
所有可用版本见:https://docs.flutter.dev/release/release-notes
查看自己下载了哪些版本:
fvm list
下载的SDK放在:~/fvm/versions下面:
全局设置
# 设置 stable 版本为全局的 SDK
fvm global stable
设置后之后,会多一个default文件夹
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % ls -l
total 0
drwxr-xr-x 33 xieshaolin staff 1056 Aug 8 17:07 cache.git
lrwxr-xr-x 1 xieshaolin staff 37 Aug 8 17:23 default -> /Users/xieshaolin/fvm/versions/stable
drwxr-xr-x 5 xieshaolin staff 160 Aug 8 17:24 versions
实际上default是一个软连接,指向了stable版本
设置环境变量
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % which flutter
/Users/xieshaolin/dev/SDK/flutter/bin/flutter
目前使用的flutter是自己手动下载的flutter,而不是fvm管理的,因此需要去设置环境变量
# 使用vscode 打开 .zshrc
code ~/.zshrc
# 以下是 环境配置 : 要注释掉之前的配置
# flutter sdk
# export PATH=~/dev/SDK/flutter/bin:$PATH
export PATH=~/fvm/default/bin:$PATH
# dart sdk
# export PATH=~/dev/SDK/flutter/bin/cache/dart-sdk/bin:$PATH
export PATH=~/fvm/default/bin/cache/dart-sdk/bin:$PATH
export PATH=~/.pub-cache/bin:$PATH
测试是否配置成功:
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % which flutter
/Users/xieshaolin/fvm/default/bin/flutter
全局切换
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % flutter --version # 这个时候是stable版本
Flutter 3.32.8 • channel stable • https://github.com/flutter/flutter.git
Framework • revision edada7c56e (2 weeks ago) • 2025-07-25 14:08:03 +0000
Engine • revision ef0cd00091 (2 weeks ago) • 2025-07-24 12:23:50 -0700
Tools • Dart 3.8.1 • DevTools 2.45.1
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % fvm global 3.0.1 # 使用3.0.1的版本
Flutter SDK: SDK Version : 3.0.1 is now global
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % flutter --version # 这个时候 全局的版本就是 3.0.1
Flutter 3.0.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision fb57da5f94 (3 years, 3 months ago) • 2022-05-19 15:50:29 -0700
Engine • revision caaafc5604
Tools • Dart 2.17.1 • DevTools 2.12.2
FVM 下载的是一个“轻量”Flutter SDK
使用 FVM 安装的 Flutter SDK,在第一次运行 flutter 命令时会触发构建 flutter tool 并下载 Dart SDK
这是因为FVM 为了节省空间,它默认下载的是 Flutter 的 最小核心版本,这个版本:
不包含完整的 Dart SDK(只是一个引用结构)
不包含
flutter tool的构建产物所以第一次运行
flutter命令时,会自动下载 Dart SDK、构建 Flutter 工具,过程就类似你看到的:Downloading Dart SDK from Flutter engine... Building flutter tool... Resolving dependencies...
这一步只会 发生一次,以后就不会再下载除非你:
- 升级了 Flutter 版本
- 清除了
.pub-cache或.dart_tool - 删除了 FVM 下的 SDK 缓存
使用FVM下载的SDK创建项目(全局情况)
VSCode
配置SDK的路径
打开命令面板 Cmd + Shift + P → Preferences: Open Settings (JSON)
添加(或修改):
{
"dart.flutterSdkPath": "/Users/xieshaolin/fvm/default"
}
让她指向default,这样我们执行fvm global命令的时候就可以自动修改VSCode所使用的SDK了。
如果想查看是不是真的换成了,可以选择Change SDK
然后就可以知道目前SDK的版本了
然后就可以测试测试了:
问题1:版本java版本过高
BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major version 65
这个错误表示:你当前使用的 Java 版本过高,不兼容当前的 Gradle 版本。
major version 65代表 Java 21- 而
Gradle 7.4并 不支持 Java 21
检查java版本java -version
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % java -version
java version "21.0.2" 2024-01-16 LTS
找到Java的路径/usr/libexec/java_home -V
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % /usr/libexec/java_home -V
Matching Java Virtual Machines (6):
21.0.2 (x86_64) "Oracle Corporation" - "Java SE 21.0.2" /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
17.0.10 (x86_64) "Oracle Corporation" - "Java SE 17.0.10" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
11.0.21 (x86_64) "Oracle Corporation" - "Java SE 11.0.21" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
1.8.391.13 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
1.8.0_391 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home
1.8.0_281 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
配置Java17的环境
code ~/.zshrc
# Java17的配置
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
source ~/.zshrc
手动指定 Gradle 使用 Java 17
在Flutter 项目的 android/gradle.properties 中,修改或添加如下环境变量到项目的 gradle 启动配置中。
org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
Android Studio
修改SDK配置
配置完成之后,接着上面的样子测试一下,没法发生报错就可以。
如何给单个项目指定SDK
切换版本
现在我们把想把3.0.1的版本换成stable(3.32.8)的版本。
进入项目目录执行命令fvm use stable
(base) xieshaolin@xieshaolindeMacBook-Pro fvm % cd /Users/xieshaolin/workpalce/flutterTest/flutter_demo2
(base) xieshaolin@xieshaolindeMacBook-Pro flutter_demo2 % fvm use stable
┌─────────────────────────────────────────────────┐
│ ⚠ Flutter SDK does not meet project constraints │
└─────────────────────────────────────────────────┘
Channel: Stable has Dart SDK 3.8.1 does not meet the project constraints of >=2.17.1 <3.0.0.
This could cause unexpected behavior or issues.
✔ Would you like to proceed? · yes
You should add the fvm version directory ".fvm/" to .gitignore.
✔ Would you like to do that now? · yes
✓ Added .fvm/ to .gitignore
✓ Dependencies resolved. (16.0s)
✓ Project now uses Flutter SDK : Channel: Stable
Channel: Stable has Dart SDK 3.8.1 does not meet the project constraints of >=2.17.1 <3.0.0.
This could cause unexpected behavior or issues.
这段话的意思是:
你当前的 Flutter Stable 版本中包含的 Dart SDK 是 3.8.1,
但你的项目的 pubspec.yaml 文件中定义的 Dart SDK 范围是:
environment:
sdk: ">=2.17.1 <3.0.0"
也就是说你的项目只支持 Dart 2.17.1 到 3.0.0 之间的版本,而 Dart 3.8.1 超出了这个范围。
会导致什么问题?
- 可能会出现依赖不兼容、语法错误或构建失败等问题。
- 因为你使用的 Flutter SDK 自带的 Dart 版本和你项目要求的不一致。
✔ Would you like to proceed? · yes
选择了继续,即使 SDK 版本不匹配。
所以 FVM 把当前项目设置为使用 stable 通道的 Flutter SDK。
You should add the fvm version directory ".fvm/" to .gitignore.
✔ Would you like to do that now? · yes
✓ Added .fvm/ to .gitignore
.fvm/是运行fvm use stable后才自动创建的目录。.fvm/是 FVM 本地管理 Flutter SDK 的目录。在项目中生成
.fvm/fvm_config.json配置文件,里面记录了你当前项目使用的是哪个 Flutter SDK 版本,比如:{ "flutterSdkVersion": "stable" }它不应该被加入 Git 仓库,否则项目体积会变大,而且每个人的 SDK 版本可能不一样。
所以 FVM 建议你自动把
.fvm/添加进.gitignore。
✓ Dependencies resolved. (16.0s)
✓ Project now uses Flutter SDK : Channel: Stable
FVM 下载或切换到了你指定的 stable Flutter SDK。
项目现在默认使用这个版本来运行构建 Flutter。
VSCode配置
手动创建.vscode/settings.json文件,然后填入以下配置:
{
"dart.flutterSdkPath": ".fvm/flutter_sdk",
// Remove .fvm files from search
"search.exclude": {
"**/.fvm": true
},
// Remove from file watching
"files.watcherExclude": {
"**/.fvm": true
}
}
"dart.flutterSdkPath": ".fvm/flutter_sdk":这是最关键的一行,告诉 VSCode 使用 FVM 管理的 Flutter SDK:
- VSCode 默认使用全局的 Flutter SDK。
- 这里显式指定为项目本地的
.fvm/flutter_sdk,这样你就可以在不同项目中使用不同版本的 Flutter,而不会互相影响。
"search.exclude": {"**/.fvm": true },:
这一行的作用是:排除
.fvm目录中的内容被 VSCode 的全局搜索功能(⌘+Shift+F)搜到。避免你在项目中搜索关键词时,出现
.fvm中的一大堆 Flutter 源码干扰结果。只是搜索层面隐藏,不会影响编译、执行等功能。
"files.watcherExclude": {"**/.fvm": true }
- 这个配置是:不监听
.fvm目录的文件变化,对性能优化有好处。 - VSCode 默认会“监听”项目中所有文件变动,触发一些插件、编译、提示等功能。
.fvm里的 SDK 文件非常多(上万个),不监听这些可以减少资源占用、避免卡顿。
reload Windows:让它重新加载一下东西
Android Studio
切换SDK配置:
修改 .idea/workspace.xml
<component name="VcsManagerConfiguration">
<ignored-roots>
<path value="$PROJECT_DIR$/.fvm/flutter_sdk" />
</ignored-roots>
</component>
为什么需要这个配置:
- 这是因为 Android Studio(基于 IntelliJ 平台)有自己的版本控制(VCS)集成系统,默认会 监听整个项目目录的所有文件变动,包括
.fvm/flutter_sdk这样的 SDK 目录。
component name="VcsManagerConfiguration"
- 表示这是 版本控制系统配置模块(VCS Manager) 的设置。
ignored-roots
- 是一个列表,告诉 Android Studio 忽略版本控制监视的根目录。
<path value="$PROJECT_DIR$/.fvm/flutter_sdk" />
- 指定要忽略的路径,即项目下的
.fvm/flutter_sdk文件夹。
作用:
- 不对
.fvm/flutter_sdk执行 Git 等版本控制操作:- 避免 Git 状态提示你
.fvm/flutter_sdk下有改动。 - 避免你误提交 Flutter SDK 到 Git 仓库。
- 避免 Git 状态提示你
- 提高性能:
.fvm/flutter_sdk文件非常多,监听它们会严重拖慢 IDE 性能。- 忽略后能加快 Android Studio 的启动、索引、版本控制响应速度。
Git忽略.fvm/flutter_sdk
当我们执行fvm use命令的时候,会自动添加如下配置到.gitignore里面
# FVM Version Cache
.fvm/
Sidekick桌面应用
Sidekick 是一个用于简化 Flutter 多版本管理和项目配置的 桌面 GUI 工具,它是 FVM(Flutter Version Management) 的图形化界面客户端。
安装网站:https://github.com/fluttertools/sidekick