###

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 示例 适用场景
直接指定版本
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
小型项目,仅单个协程依赖
BOM 管理
implementation platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3")
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android"
多模块或同时使用 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 编译配置校验清单

  1. Gradle 插件兼容性:AGP 8.2+ 不需要额外配置;若使用 AGP 7.x,需在 settings.gradle.kts 中启用 jvmToolchain:kotlin { jvmToolchain(17) }。
  2. minSdk 版本:kotlinx-coroutines-android 1.7.x 要求 minSdk ≥ 21,低版本项目需升级。
  3. 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 依赖层、编译器配置层与应用层的衔接关系:

Gradle 依赖与编译配置结构(LiveData → Flow 迁移前) build.gradle(模块) dependencies { … } kotlinOptions { … } proguard-rules.pro BOM coroutines-android core (可选) test (可选) jvmTarget = "1.8" -opt-in=FlowPreview -Xskip-metadata-version-check -keep class kotlinx.coroutines.** @Keep interface FlowCollector 编译校验:依赖树 √ | 编译器标志 √ | 混淆规则 √ 运行 ./gradlew :app:tasks --group build 确认所有配置无误后再进入编码迁移

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 行。