将Compose迁移到现有项目中


theme: channing-cyan

升级AndroidStudio

你可以升级AndroidStudio为最新版,直接去AndroidStudio官网更新AndroidStudio即可。

升级gradle

你需要升级你的gradle为7.0及以上,如下:

buildscript { ... dependencies { classpath "com.android.tools.build:gradle:7.0.0" ... } } 这一步可能遇到很多问题,请移步到后面的问题以及解决

升级kotlin版本

接着,你需要升级你的kotlin版本为1.5.21及以上,如下:

plugins { id 'org.jetbrains.kotlin:android' version '1.5.21' }

开启Compose

接着,你需要将应用的最低API版本设置为21及以上,并在build.gradle中启用Compose,还需要指定kotlin编译器插件版本,如下:

``` android { defaultConfig { ... minSdkVersion 21 // 最低版本为21 }

buildFeatures {
    // 为当前module启用 compose
    compose true
}
...

// java和kotlin编译版本都指定为1.8
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = "1.8"
}

// 指定编译版本
composeOptions {
    kotlinCompilerExtensionVersion '1.0.1'
}

} ``` 并且,你需要指定项目的JDK版本为JDK11及以上AndroidStudio -> 设置 -> Gradle -> Gradle JDK -> 选择JDK11及以上

添加依赖

接着,你需要在开启compose的module中的build.gradle中添加compose使用的依赖,比如我自己的项目中添加有如下依赖: ``` compose_version = '1.0.1'

// 基础UI框架
implementation "androidx.compose.ui:ui:$compose_version"
// Material风格布局
implementation "androidx.compose.material:material:$compose_version"
// Compose扩展Activity
implementation 'androidx.activity:activity-compose:1.3.0-alpha06'
// UI测试
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
// UI工具包
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"

// Material风格图标
implementation("androidx.compose.material:material-icons-core:$compose_version")
implementation("androidx.compose.material:material-icons-extended:$compose_version")

// 图片加载框架
implementation 'io.coil-kt:coil-compose:1.3.0'

``` 这些依赖不唯一,可以根据项目的需要添加。

Compose和原生View的互调

Android原生View使用ComposeView

比如我用Compose写了个界面,要在原来的xml布局中使用它,可以这样:

1) 在xml布局中添加androidx.compose.ui.ComposeView,然后findViewById(id)出来,然后使用composeView.setContent(@Composable)即可。 2) 直接在代码中创建出ComposeView,然后使用composeView.setContent(@Composable)

比如第一种方式:

我们先在xml文件中添加androidx.compose.ui.ComposeView <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> 然后在代码中使用: ``` // 定义一个Compose风格的View @Composable fun TextView() { Text(text = "this is a compose TextView") }

// 使用 val composeView: ComposeView = findViewById(R.id.compose_view) composeView.setContent { TextView() } ```

ComposeView使用Android原生View

在\@Composable内使用: androidx.compose.ui.viewinterop.AndroidView,然后在factory里面返回原生View即可。如下:

@Composable fun TextView() { Text(text = "this is a compose TextView") // 使用androidx.compose.ui.viewinterop.AndroidView AndroidView( // 需要提供一个factory来返回我们要使用的Android原生View,这里我们返回一个原生的ImageView factory = { context -> ImageView(context) }, // modifier,可以不提供 modifier = Modifier.padding(20.dp), // update,每次compose重组会调用到这里,可以不提供 update = { imageView -> Log.d("Compsose", "$imageView has update") }) }

AndroidView的函数原型如下: @Composable fun <T : View> AndroidView( factory: (Context) -> T, // 返回原生View modifier: Modifier = Modifier, // 修饰符 update: (T) -> Unit = NoOpUpdate // 每次界面重组(更新)调用 )

问题以及解决

我们遇到的大部分问题都是兼容性问题,而且集中在升级gradle到7.0这一步,再次吐槽下gradle!

  • 1 所有使用compile 'xxxx'需要替换为api/implementation 'xxxx'。
  • 2 gradle7.0不再支持非https的依赖,所以原有的http仓库的依赖,需要替换为https依赖,比如: maven { url 'http://dl.bintray.com/umsdk/release' // http仓库不安全 } 就要替换为 maven { url 'https://dl.bintray.com/umsdk/release' // 替换为https类型的仓库 }
  • 3 一些插件会失效,所以要 去这些插件的官网 或者 gradle官网 查看更新日志 来找到对应的替换方案,比如: 比如 apply plugin 'maven',需要替换为 apply plugin 'maven-publish'
  • 4 gradle的一些语法有更新,需要查看更新日志来进行更新,比如: 使用maven进行仓库发布的api更新了,就需要查看官网进行修改。
  • 5 如果你的项目是混合开发,比如rn或者flutter,就需要检测这些项目并且做相应更新(很蛋疼!)。

最后

迁移Compose到现有项目,需要耐住脾气和性子,一点一点来,不然很容易火大,而且要自底向上迁移,尽量缩小影响范围。

最后想吐槽一下,Google更新的真频繁!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值