最近实在是太忙了,没什么时间来更新文章。在开发过程中遇到一个问题——Flutter如何优雅实现多版本开发及管理,经过实践和摸索,有一些所得,记录及分享如下:
🔴 Flutter自带的版本管理工具:flutter channel
flutter channel是 Flutter 官方提供的工具,用于在不同的版本通道之间切换,例如:stable、beta、dev、master等。其目标是为开发者提供灵活的版本测试和快速体验新特性通道的能力。
1️⃣ 特点
-
原生支持,无需额外安装工具:通过命令行直接使用,如
flutter channel stable、flutter channel dev等。 -
切换简便:通过
flutter channel+flutter upgrade即可切换到目标版本。 -
跟踪官方版本节奏:各个通道与 Flutter 官方发布节奏同步,适合需要跟进新特性的场景。
-
自动应用到所有项目:当前系统 Flutter SDK 版本一旦切换,全局生效,所有项目都会统一使用该版本。
2️⃣ 存在问题
- 不支持每个项目使用不同版本,只能全局切换
- 不支持多个版本共存
- 没有版本锁配置
- 切换版本耗时较长
- 不支持自定义版本号或补丁版本,只能选择官方的几个通道,无法指定精确的某个 commit 或 tag
- 对团队协作不友好:不同开发者使用的通道不一致容易导致环境不一致,出现难以复现的问题。
3️⃣ 适用场景
-
✅ 只有一个项目,并且始终使用最新
stable通道:无需频繁切换,flutter channel足够满足开发需求。 -
✅ 个人开发,对 Flutter 版本没有严格要求:例如学习、试验、构建小型工具等,使用最新稳定版或尝鲜版都能接受。
🔴 FVM (Flutter Version Manager)优雅实现多版本管理及开发
官方原话,我就就不翻译了:FVM helps with the need for consistent app builds by referencing the Flutter SDK version used on a per-project basis. It also allows you to have multiple Flutter versions installed to quickly validate and test upcoming Flutter releases with your apps without waiting for Flutter installation every time.
1️⃣ Github活跃度
-
Github 地址:👉 github.com/leoafarias/…
-
⭐ Star 数虽然只有5.1k,但社区非常活跃,Issue/PR 处理及时,文档也在不断完善。
-
已被多个成熟项目采纳,并不是小众项目,所以基本不用担心维护和兼容问题。
2️⃣ 可以解决哪些痛点
- ✅ 每个项目绑定独立 Flutter 版本:项目根目录会生成
.fvm/fvm_config.json和.flutter-version,团队协作时可避免版本不一致的问题。 - ✅ 支持多个版本共存:FVM 会统一把所有版本的 Flutter 安装在
~/.fvm/versions/(或你自定义的位置),版本之间互不影响。 - ✅ 快速切换项目版本:通过
fvm use <version>快速指定,免去flutter upgrade带来的耗时。 - ✅ 稳定性提升:不会被全局 Flutter 切换影响,可以放心测试 beta/dev/master 分支的特性。
- ✅ CI/CD 集成更方便:可以锁定版本,便于构建脚本使用指定 SDK,避免因 Flutter 升级导致的构建失败。
- ✅ 不污染全局 Flutter 环境:不再依赖
flutter channel,不用担心全局版本被意外改动。
3️⃣ 适用场景
-
✅ 维护多个 Flutter 项目,版本要求不同
-
✅ 团队协作,需要固定版本,避免“我的电脑没问题”的尴尬
-
✅ 需要在 stable/beta/dev 之间频繁切换测试
-
✅ 参与 Flutter 插件开发或开源项目,需要测试多个 Flutter 版本兼容性
-
✅ CI/CD 持续集成中需要明确版本依赖
3️⃣ FVM开发环境集成(win10)
➡ 安装 Chocolatey
- 使用管理员身份打开powershell运行(可以指定安装到想要的路径如
D盘)
$env:ChocolateyInstall = "D:\Tools\chocolatey"
Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
- 验证是否安装成功
PS C:\WINDOWS\system32> choco -v
2.4.3
- 更新choco
choco upgrade chocolatey
➡ 安装fvm
- 指定路径安装之后fvm也会与choro同目录
choco install fvm
fvm --version
➡ 设置fvm缓存路径
- 如果不想系统盘存储吃紧,建议设置
fvm config --cache-path D:\FvmFlutterSDKs
4️⃣ 常用命令
🔍 基础信息查询
| 命令 | 说明 |
|---|---|
fvm --version | 查看 FVM 当前版本 |
fvm list | 查看本地已安装的 Flutter 版本 |
fvm releases | 查看所有可安装的 Flutter 官方版本 |
fvm doctor | 检查当前项目配置和环境状态 |
📦 安装 / 卸载版本
| 命令 | 说明 |
|---|---|
fvm install <version> | 安装指定版本,如 fvm install 3.27.1 |
fvm remove <version> | 卸载指定版本 |
📂 项目版本管理
| 命令 | 说明 |
|---|---|
fvm use <version> | 绑定当前项目使用该版本(会生成 .fvm/ 配置) |
fvm use stable | 绑定当前项目使用最新 stable 版本 |
fvm global <version> | 设置全局默认版本(不建议用于多人协作项目) |
⚙️ 配置管理
| 命令 | 说明 |
|---|---|
fvm config | 查看当前 FVM 配置 |
fvm config --cache-path <路径> | 更改 Flutter SDK 缓存路径 |
🚀 执行 Flutter 命令
| 命令 | 说明 |
|---|---|
fvm flutter <命令> | 用当前项目绑定版本运行 Flutter 命令 |
例:fvm flutter pub get | 获取依赖 |
例:fvm flutter run | 启动调试 |
例:fvm flutter doctor | 检查环境 |
5️⃣ fvm镜像源设置
➡ 全局设置
- 方法1:全局更改:
fvm config --flutter-url https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git - 方法2(示例):export FVM_FLUTTER_URL="github.com/org/custom-…"
➡ 局部设置
- 修改.fvmrc文件flutterUrl属性(示例)
{
"flutterUrl": "https://github.com/org/custom-flutter.git"
}
6️⃣ 项目实战(切换到3.27.1为例)
➡ 3.27.1版本安装
fvm install 3.27.1
➡ 管理员身份运行cmd并执行:fvm use 3.27.1
- 在所在项目的根目录以管理员身份运行cmd并执行:
fvm use 3.27.1
➡ 项目依赖更新
- 在所在项目的根目录执行
fvm flutter pub upgrade
➡ 配置项目的.vscode\settings.json文件
{
"cSpell.words": [
"appbar",
"cupertino",
"dists",
"formkey",
"fpdart",
"MVVM",
"Pallete",
"riverpod",
"Schyler",
"viewmodel"
],
"dart.flutterSdkPath": ".fvm/versions/3.27.1"
}
➡ 确认配置的版本是否生效
- 确认软连接指定的版本正确即可
➡ fvm flutter run运行测试
- 正常是可以正常运行的
7️⃣ 问题解决
➡ 安卓版本不兼容问题
💥 问题描述
PS D:\FlutterProjects\musicapp\client> fvm flutter run
Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!
Launching lib\main.dart on sdk gphone x86 64 in debug mode...
Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processDebugResources'.
> A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction
> Android resource linking failed
aapt2.exe E 06-02 08:10:09 18232 8212 LoadedArsc.cpp:94] RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data.
aapt2.exe E 06-02 08:10:09 18232 8212 ApkAssets.cpp:149] Failed to load resources table in APK 'D:\software\Android\Sdk\platforms\android-35\android.jar'.
error: failed to load include path D:\software\Android\Sdk\platforms\android-35\android.jar.
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
BUILD FAILED in 28s
Running Gradle task 'assembleDebug'...
💥 根本原因
- 根本原因:旧版本android配置项不兼容
| Flutter SDK 版本 | compileSdk 最小版本 | Android Gradle Plugin 最小版本 |
|---|---|---|
| 3.19.x | 34 | 7.4.x |
| 3.22.x+(如 3.27) | 35 | 8.1.x |
❤ 解决办法
-
修改
android/settings.gradle``` # 修改前 plugins { id "com.android.application" version "7.3.0" apply false id "org.jetbrains.kotlin.android" version "1.7.10" apply false } # 修改后 plugins { id "com.android.application" version "8.1.2" apply false id "org.jetbrains.kotlin.android" version "1.9.10" apply false } ``` -
清理后重新运行
``` fvm flutter clean fvm flutter pub get fvm flutter run ```
以上就是使用fvm解决flutter channel局限性并优雅解决flutter多版本管理及开发问题的摸索及总结,希望对有需要的小伙伴有所帮助,欢迎交流