Jetpack Compose 实践 - 1

239 阅读1分钟

前言

  • 记录并整理EasyWallet 小钱包开发过程

  • 在项目中使用到:

    1. Composing build + plugin 实现依赖库统一管理
    2. Jetpack Compose
    3. Hilt 依赖注入
    4. Kotlin/Kotlin flow/Coroutine
    5. Ktor 实现网络请求
    6. Room 实现本地存储
  • 本项目地址:EasyWallet-Compose

gradle 脚本管理

  • 创建新的模块作为Composing build,并在 build.gradle.kts 中加入如下代码实现plugin配置
gradlePlugin {
    plugins {
        create("VersionPlugin") {
        id = "version-plugin" // change the name you like
        implementationClass = "com.easy.version.DependencyVersionPlugin" // change package to what you done
        }
    }
}
  • src.main.kotlin 目录下Plugin实现类实现接口 Plugin<Project>,这个plugin 的apply 方法会在任何你使用这个plugin的module 执行

  • 统一管理Configs。 (这里我为了区分feature模块和app模块,所以加了ignore list)

  1. 首先我们在每个模块都需要的plugin,写一个Project的扩展函数
private fun Project.applyPlugin() {
    apply(plugin = "com.android.library")
    apply(plugin = "kotlin-android")
    apply(plugin = "kotlin-kapt")
    apply(plugin = "kotlin-parcelize")
}

然后在apply方法中使用

target.beforeEvaluate { applyPlugin() }

这里注意要加上beforeEvaluate,在执行前apply plugin

  1. 配置 android 块

增加扩展方法 LibraryExtension.moduleConfig(isCore: Boolean) (isCore这里算是我项目的特殊支持,为了实现buildConfigField的)

@Suppress("UnstableApiUsage")
private fun LibraryExtension.moduleConfig(isCore: Boolean) {
    compileSdk = BuildConfig.compileSdkVersion
    defaultConfig {
        minSdk = BuildConfig.minSdkVersion
        targetSdk = BuildConfig.targetSdkVersion
    }

    buildTypes {

    ...

    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    buildFeatures.also {
        it.compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = Compose.version
    }
    ...
}

  • 最后在root project中增加
subprojects {
    apply(plugin = "version-plugin")
}

给每个模块都应用上plugin,当然也可以单独在module上直接应用

  • 以上配置完成后,你会看到模块的 gradle 脚本基本就很少了, 如下
import com.easy.version.*

dependencies {

    implementation(project(":core"))
    implementation(project(":core-ui"))

    implementation(com.easy.version.dependencies.Other.sqlcipher)

    roomDependencies()
    composeUI()
    hiltDependencies()

    unitTestDependencies()
    androidTestDependencies()

}

后记

业务功能分析