Gradle 依赖升级:为 Flow 铺平协程道路
将 LiveData 迁移至 Flow,首先需要确保项目的基础设施——Gradle 构建系统——已准备好支持 Kotlin 协程与 Flow API。本章核心任务是在 build.gradle(模块级)中精确添加 kotlinx-coroutines-android 依赖,并验证编译器配置,避免运行时出现类加载冲突或 API 不可用问题。
核心目标:升级依赖版本至
1.7.3 或更高,开启 Kotlin 1.8+ 编译器对协程实验性 API 的支持,并消除与 LiveData 共存时的构建警告。
4.1 依赖声明:直接添加 vs BOM 管理
推荐使用 Coroutines BOM(Bill of Materials) 统一管理版本,确保所有协程库(core、android、test)版本对齐。以下是两种声明方式对比:
| 方式 | build.gradle 示例 | 适用场景 |
|---|---|---|
| 直接指定版本 | |
小型项目,仅单个协程依赖 |
| BOM 管理 | |
多模块或同时使用 core、test 等库 |
版本冲突避坑:若项目中已存在老版本
kotlinx-coroutines-core(如 1.5.x),直接添加 android 衍生库会自动拉回旧版 core,导致 Flow 部分 API 缺失。始终先通过 ./gradlew :app:dependencies --configuration releaseRuntimeClasspath 检查依赖树。
4.2 编译配置校验:启用协程实验性标志
Kotlin 编译器默认将协程视为稳定功能,但部分 Flow 操作(如 flatMapLatest 的 @FlowPreview 注解)仍需显式启用。在 build.gradle 的 kotlinOptions 中设置:
android {
// ...
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs += [
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", // 可选:若使用实验性API
"-opt-in=kotlinx.coroutines.FlowPreview" // 必选:使用 Flow 预览 API
]
}
}
ProGuard/R8 规则:迁移后 Flow 使用大量内联函数和 kotlinx.coroutines 内部类,需添加保留规则防止混淆:
-keep class kotlinx.coroutines.** { *; }
-keepnames class kotlinx.coroutines.flow.** { *; }
4.3 编译配置校验清单
- Gradle 插件兼容性:AGP 8.2+ 不需要额外配置;若使用 AGP 7.x,需在
settings.gradle.kts中启用jvmToolchain:kotlin { jvmToolchain(17) }。 - minSdk 版本:
kotlinx-coroutines-android1.7.x 要求 minSdk ≥ 21,低版本项目需升级。 - kotlinx-metadata-jvm 冲突:若同时使用
kotlin-parcelize与协程,需排除冲突传递依赖:
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") {
exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib-jdk8"
}
4.4 迁移依赖结构总览
下图展示了从 LiveData 环境升级至 Flow 兼容环境时,Gradle 依赖层、编译器配置层与应用层的衔接关系:
4.5 常见错误与快速修复
- 错误 1:
Cannot access 'kotlinx.coroutines.flow.Flow'→ 检查是否漏加kotlinx-coroutines-core或版本不一致。添加并同步项目。 - 错误 2:
Type 'Flow' is not accessible from 'R8/ProGuard'→ 未保留协程类。在proguard-rules.pro中添加-keep class kotlinx.coroutines.flow.** { *; }。 - 错误 3:
Unresolved reference: flatMapLatest→ 缺少-opt-in=kotlinx.coroutines.FlowPreview。在kotlinOptions中添加后重试。
验证脚本:在项目根目录执行以下命令确保所有配置正确解析:
./gradlew :app:dependencies --configuration releaseRuntimeClasspath | grep coroutines
./gradlew :app:generateDebugBuildConfig
输出应包含 kotlinx-coroutines-android:1.7.3,且无 ERROR 或 WARNING 行。