当前位置:   article > 正文

KMM+Compose 开发一个Kotlin多平台应用_kotlin compose

kotlin compose

前言

现在跨平台开发框架有很多,比如H5类型,RN,Flutter等,而Kotlin多平台+Compose跨平台ui可能也是未来一种好用的开发框架

ps:后文KMM都是指Kotlin多平台框架,而不是单指Kotlin Multiplatform Mobile

虽然目前KMM还有些不太成熟,Compose跨平台的支持平台不太全,但也不妨碍现在来尝尝鲜.

ps:Compose-android正式,Compose-desktop正式,Compose-web未正式,Compose-ios期待中...

项目创建和结构分析

首先我们使用idea来创建一个KMM+Compose的原始框架项目

我们先将idea更新到最新(如果不想下载idea可以在文末下载示例的源码)

然后:File->New->Project

然后设置一下安卓sdk位置,点完成

 创建好项目可以选择使用Android Studio或idea编写代码

idea,先同步一下gradle:

 as,一般会自动同步gradle,手动如下:

我们可以看到有三个主要的开发目录:

android目录内其实就是一个安卓项目

desktop目录是一个jvm程序目录,运行其中的main函数,会出现一个GUI(也就是compose-desktop的程序),其中的程序目前是运行在一个精简版的jvm虚拟机中(打出来的包就带有精简版的jvm虚拟机,所以不依赖jvm环境),据说会有直接转成native的能力(目前不清楚有没有)

common目录是kmm的核心目录,可以看到其中有androidMain,commonMain,desktopMain等目录

commonMain是共享代码目录,只能调用kotlin基础库和多平台的三方库能力(比如compose,ktor等)

由于commonMain并不隶属于特定平台,所以只能交由 androidMain 和 desktopMain 来实现特定的平台能力(后面会看到示例)

common目录相对于android目录,相当于是安卓项目的一个library

common目录相对于desktop目录,相当于是jvm项目的一个library

ps:由于目前两个平台都是基于jvm的,所以commonMain目录也可以使用jvm基础库(File等)

多平台的三方库

 基于多平台的comopse框架,我们可以直接在commonMain中写compose代码,在android和desktop中都可以调用:

 KMM多平台能力

我们看一下App.kt中的getPlatformName()函数,可以发现他是这样声明的:

 这个相当于在共享模块声明它的签名,然后我们可以在每个平台中进行实现

androidMain目录中该函数的实现(desktopMain中实现也是这样):

这样我们就拥有了多平台开发能力,只要将平台间不兼容的地方声明一个待实现的多平台函数,然后在每个平台实现,就可以在commonMain中轻松使用了

 接下来我们就去写一个简单的程序

正文

compose写ui

我们要实现的ui如下,非常简单:

 

代码如下:

  1. package com.lt.kmm_and_compose_sample.common
  2. import androidx.compose.foundation.layout.*
  3. import androidx.compose.foundation.lazy.LazyColumn
  4. import androidx.compose.material.Button
  5. import androidx.compose.material.Text
  6. import androidx.compose.runtime.*
  7. import androidx.compose.ui.Modifier
  8. import androidx.compose.ui.unit.dp
  9. /**
  10. * creator: lt 2022/3/15 lt.dygzs@qq.com
  11. * effect : 简单的根据数量放置list的条目
  12. * warning:
  13. */
  14. @Composable
  15. fun NumberList() {
  16. //设置数量的状态对象(State)
  17. var number by remember { mutableStateOf(5) }
  18. //相当于竖向的线性布局
  19. Column {
  20. //相当于横向的线性布局
  21. Row {
  22. //设置一个按钮
  23. Button({
  24. //按钮的点击事件,点击后改变状态对象内的值,会引发使用该对象的compose组件重组
  25. number++
  26. }) {
  27. //设置按钮内的组件ui
  28. Text("数量+1")
  29. }
  30. //设置一个宽度为8dp的占位,相当于将他们两个隔开了一点(就像margin)
  31. Spacer(Modifier.width(8.dp))
  32. Button({
  33. number--
  34. }) {
  35. Text("数量-1")
  36. }
  37. Spacer(Modifier.width(8.dp))
  38. Text("总数量:$number")
  39. }
  40. Spacer(Modifier.height(8.dp))
  41. //相当于竖向的RecyclerView
  42. LazyColumn {
  43. //相当于RecyclerView.Adapter,只不过更简单
  44. items(number) {
  45. //设置item的ui
  46. Item(it)
  47. }
  48. }
  49. }
  50. }
  51. @Composable
  52. fun Item(index: Int) {
  53. //我们的item的ui中只有一个文字,并且设置了一下padding
  54. Text("索引为:$index", modifier = Modifier.padding(5.dp))
  55. }

我们把android文件夹中的MainActivity给App()代码注掉,然后使用我们刚写的compose代码

 运行安卓项目后,点击数量+1,总数量文字会变,而且条目也会多一个

然后我们再修改一下desktop文件夹中的Main.kt

然后运行这个main函数看一下compose-desktop的效果(LazyColumn的滚动是滚动鼠标滚轮)

使用KMM多平台方法

首先我们在commonMain的platform.kt文件中定义一下expect fun:

然后我们在androidMain和desktopMain中实现一下这个函数,为了简单就直接写死一个数了, 

然后我们稍微改一下ui:

在 Text("总数量:$number") 下面增加如下代码:

ps:调用多平台函数可能没有代码提示emmm

  1. Button({
  2. number = getNumber()
  3. }) {
  4. Text("从本地加载数量")
  5. }

 然后一个简单的多平台应用就搞好了,后面有时间再写更复杂的功能

源码: ltttttttttttt/KMM_and_Compose_Sample

end

对Kotlin或KMP感兴趣的同学可以进Q群 101786950

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/959147
推荐阅读
相关标签
  

闽ICP备14008679号