Jetpack Compose 01之环境配置

终于下定决心要开启Compose世界的大门了,如果是新建一个项目,应该不会遇到什么问题,然而要从一个旧的项目中引入compose,遇到的问题还是比较多的。在此特别记录一下主要的环境配置步骤及遇到的一些问题及解决方案。

kotlin环境配置

Compose目前只能使用Kotlin,之前对Kotlin只是初步的了解。不过项目中也使用了一点kotlin,所以基本的环境已有,百度的结果说开启compose世界的大门很简单,大概下面三个配置

Copy Code

buildFeatures {
    compose true
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = "1.8"
}

composeOptions {
    kotlinCompilerExtensionVersion '1.3.2'
}

然后现实很骨感,给我这么一个下马威

Copy Code

This version (x.x.x) of the Compose Compiler requires Kotlin version y.y.y but you appear to be using Kotlin version z.z.z which is not known to be compatible.  Please fix your configuration (or `suppressKotlinVersionCompatibilityCheck` but don't say I didn't warn you!).

应该是Kotlin版本太低了,升级到最新的1.7.20先升了再说,相应的依赖组件也升级到此对应版本,这个不知道什么原因,我只能使用1.6.0(不过最终仍然被我升级到了1.7.20)

Gradle配置

吃了之前的亏,我就新建了一个Compose Activity新项目,发现app/build.gradle引入插件的方式变了,都看不见build-tool了,应该是新的方法,立马应用一波,结果

Copy Code

Plugin [id: 'com.android.application', version: '7.2.0', apply: false] was not found in any of the following sources:

invalidate caches及restart及百度无果之后,发发现新建的项目settings.gradle有变化,添加了如下配置

Copy Code

pluginManagement { // 这是build工具组件的搜索仓库
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories { // 这是项目依赖组件的搜索仓库
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

终于sync成功了

添加Compose依赖

Copy Code

dependencies {
    // 这个是最基本的组件
    implementation 'androidx.compose.ui:ui:1.2.1'
    // 工具支持比如预览
    implementation 'androidx.compose.ui:ui-tooling:1.2.1'
    // 基础类的控件,比如按钮等
    implementation 'androidx.compose.foundation:foundation:1.2.1'
    // MD,还有个MD3,不过还没有正式Release
    implementation 'androidx.compose.material:material:1.2.1'
    // MD图标
    implementation 'androidx.compose.material:material-icons-core:1.2.1'
    implementation 'androidx.compose.material:material-icons-extended:1.2.1'
    // 集成Activity
    implementation 'androidx.activity:activity-compose:1.5.1'
    // 集成ViewModels
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'

    // UI 测试
    androidTestImplementation 'androidx.compose.ui:ui-test-junit4:1.2.1'
}

又报类重复冲突

Copy Code

Duplicate class androidx.lifecycle.ViewModelLazy found in modules jetified-lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1.

升级组件,升级后还是报类似的错,依赖中把java及ktx的组件全加进去。类似的还是jetpack core组件,相同的解决方式。此问题修复

后来中途不知道做了什么操作,import中的 compose全部标红。gradle sync一直失败
Gradle sync failed: Sync failed: reason unknown
一度怀疑改错了什么,clean、invalidate及restart都都想放弃了。仔细对比之后发现修改应无问题才是,回过头去运行之前创建的新工程,发现也无法运行。
Unable to find Gradle tasks to build: [:].

详细的错误日志是这些看不懂的

Copy Code

Could not initialize class com.jetbrains.cidr.lang.dfa.contextSensitive.OCSo
... 
Exception 'java.lang.NoClassDefFoundError: Could not initialize class com.jetbrain.
...
ClassNotFoundException: kotlin.reflect.jvm.KClassesJvm

这TM的就好办了,肯定是AS抽筯了,重新安装AS,问题解决。

总结

其实遇到的问题非常多,大约十几个,复杂一点的就上面几个,新的技术,建议还是参考官方新项目来搞,旧项目坑太多了,尤其是最后一条,太坑了,不过越是难,越有挑战性,遇到问题不要慌,冷静思考,沉着应对。相信总会解决的。