第2章 项目搭建与依赖配置

2.1 本章目标与前置知识

本章将引导你从零搭建一个完整的 Compose 支付演示项目,按照生产级应用的依赖管理标准,依次添加 Material3 主题库、Navigation 导航组件以及 Coil 图片加载库。完成本章后,你的开发环境将具备支持 State Hoisting 所需的全部基础设施。

  • 目标项目结构:单一 Module App,基于 Gradle + Kotlin DSL
  • 核心依赖:androidx.compose.material3、androidx.navigation.compose、io.coil-kt.coil-compose
  • 版本管理:统一使用 BOM (Bill of Materials) 避免版本冲突
提示:State Hoisting 在项目层面要求 ViewModel 和 Navigation 充分解耦,本章的依赖配置已为后续章节的 ViewModel 注入、参数传递及图片状态管理做好了准备。

2.2 创建 Compose 项目

使用 Android Studio (Arctic Fox 或更高版本) 创建新项目时,选择 Empty Compose Activity 模板。项目创建后,自动生成如下关键文件:

文件/目录 作用
app/build.gradle.kts 模块级构建脚本,存放依赖声明
build.gradle.kts 项目级构建脚本,用于声明全局 BOM 与插件
settings.gradle.kts 项目模块注册与仓库配置
MainActivity.kt 默认的 Compose Activity 入口
ui/theme/ Material3 主题文件(可后续替换)

2.3 添加 Material3 库

Material3 是 Google 推荐的 Material Design 最新实现,通过 BOM 统一管理 Compose 所有库的版本。在 app/build.gradle.kts 中配置如下:

dependencies {
    // Compose BOM – 统一版本
    val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
    implementation(composeBom)

    // Material3 核心库
    implementation("androidx.compose.material3:material3")

    // 可选:Material3 Window Size Class (适配大屏)
    implementation("androidx.compose.material3:material3-window-size-class")
}

在项目级 build.gradle.kts 的 plugins 块中确保已启用 Compose 编译器插件(版本与 Kotlin 匹配):

plugins {
    id("com.android.application") version "8.2.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.22" apply false
}
关键点:使用 BOM 后,不需要为每个 Compose 库单独指定版本号,依赖库之间的版本冲突由 BOM 自动协调。这是稳定性和可维护性的最佳实践。

2.4 配置 Navigation 组件

Navigation for Compose 提供声明式路由和 NavHost 管理。在 app/build.gradle.kts 中添加:

implementation("androidx.navigation:navigation-compose:2.8.3")

由于 navigation-compose 未纳入 Compose BOM,需要单独指定版本。注意与 Compose 和 Kotlin 的兼容性,推荐使用官方版本兼容表。

在 MainActivity.kt 中创建 NavController 并绑定 NavHost:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PaymentTheme {
                val navController = rememberNavController()
                NavHost(navController = navController, startDestination = "home") {
                    composable("home") { HomeScreen(navController) }
                    composable("payment") { PaymentScreen(navController) }
                }
            }
        }
    }
}

2.5 引入 Coil 图片加载

Coil 是一款纯 Kotlin 协程驱动的图片加载库,与 Compose 集成非常自然。添加依赖:

implementation("io.coil-kt:coil-compose:2.7.0")

Coil 无需额外初始化,但在 Image 中使用时需提供 ImageRequest:

AsyncImage(
    model = ImageRequest.Builder(LocalContext.current)
        .data("https://example.com/product.png")
        .crossfade(true)
        .build(),
    contentDescription = "产品图片",
    modifier = Modifier.fillMaxWidth()
)

2.6 完整依赖清单预览

以下为 app/build.gradle.kts 中本章涉及的完整 dependencies 块:

dependencies {
    implementation(platform("androidx.compose:compose-bom:2024.10.01"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.material3:material3")
    implementation("androidx.compose.material3:material3-window-size-class")
    implementation("androidx.compose.ui:ui-tooling-preview")
    implementation("androidx.navigation:navigation-compose:2.8.3")
    implementation("io.coil-kt:coil-compose:2.7.0")
    debugImplementation("androidx.compose.ui:ui-tooling")
    implementation("androidx.activity:activity-compose:1.9.2")
}

2.7 调试与常见错误

常见错误 原因 解决方案
Compose 版本不匹配(如 Material3 方法找不到) BOM 版本过旧或未使用 BOM 更新 compose-bom 至 2024.10.01 或更高
Navigation 路由无法跳转 NavController 作用域不当或 composable 未注册 确保 composable 块在 NavHost 内部且路由名称一致
Coil 图片加载失败(显示占位图或空白) 网络权限缺失或 URL 不可达 在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.INTERNET"/>
Kotlin 编译器版本与 Compose 插件不兼容 kotlin 版本与 compose-compiler 不匹配 参考 Compose 兼容性表升级 Kotlin

2.8 性能与稳定性优化

  • BOM 版本锁定:使用固定的 compose-bom 版本号(如 2024.10.01),避免自动升级引入破坏性变更。
  • minSdk 要求:Material3 和 Navigation 要求 minSdk 至少为 21,在 build.gradle.kts 中显式设置:minSdk = 21。
  • Coil 内存缓存:Coil 默认使用 LruCache,无需额外配置。但若加载大量图片,可考虑自定义 ImageLoader 并调整磁盘缓存大小。
  • Navigation 懒加载:通过 composable(route, arguments) { backStackEntry -> ... } 实现懒初始化,避免所有 Screen 在启动时同时加载。
警告:不要将 Navigation 路由硬编码字符串直接写在 composable 函数内,建议使用 sealed class 或常量文件管理路由,以支持 State Hoisting 中的类型安全导航。
项目搭建与依赖配置流程 1. 创建 Compose 项目 2. 添加 Material3 BOM 3. 配置 Navigation 4. 引入 Coil 图片库 5. 同步 Gradle & 验证 开发环境就绪 依赖管理要点: • Material3 通过 BOM 版本管理,避免手动指定每个 Compose 库版本。 • Navigation 和 Coil 需单独指定版本,务必检查与 Compose BOM 的兼容性。 • 建议锁定所有版本号(包括 Kotlin 和 AGP),确保团队构建一致性。 • 验证方式:运行空项目,观察 Material3 和 Coil 示例组件是否正常渲染。

完成以上步骤后,你的开发环境已具备实现 State Hoisting 支付页面的全部依赖基础。下一阶段将利用这些基础设施构建可复用的页面组件。