前言
最近的compose是不是发的太多了?哈哈,当然这也是因为对它有很大的期待吧,就在前不久,在荷兰的会议上,Compose for iOS进入了我们的视野。事实上Compose for iOS之前我们也见过,但是存在一个问题,就是布局得用iOS的写法,但逻辑可以给Android和iOS共享。
现在,Compose再次迎来突破,打破了布局上的差异,现在起使用KMM+Compose,就可以直接写iOS项目了。
起步
看看这个在 iOS 平台上使用 Compose Multiplatform | KotlinConf 23’_哔哩哔哩_bilibili
OK,compose已经能做到这里了,怎么样?效果也是相当惊艳的。
事实上我已经迫不及待的体验了,但是我没有Mac,这并不意外,因为Mac的价格并不便宜,当然这并不能成为我不学习,不了解它的借口,因此,今天我正式拉取了下官方的跨平台模板。
拉取模板
看下面的仓库,及时我们没有Mac也完全可以拉取和打包项目(iOS除外)。
但是如果你是Mac,那么除了拉取代码记得看这里
这个东西是用来打包iOS项目必要的,因此假如你是Mac,就可以安装它。
项目结构
我们看看下面的项目结构,诶嘿,有点不太一样
我作为安卓开发者,为了使用compose的跨平台自然是去看看AndroidApp文件夹。
我们发现了个什么问题,这个MainActivity使用了setContent来加载视图,意味着这里已经引入了compose了。
哦豁,这个MainView来自另一个模块,并且这个方法也是调了另一个函数。
终于是找到了,布局在这里,诶?奇怪,没有预览注解?(后面说这个),再看看目录,现在我们在这个shared模块下的commonMain里的App.kt,从名字就看出来安卓和iOS都需要依赖这个模块,并且使用里边的东西。
事实也是如此,我们可以发现上下是有Android和iOS的模块的
这两个文件里事实上都只写了这两个方法,都是为了把App函数里的内容传出去,现在我们大胆的想一下,AndroidApp模块和iosApp模块里的入口活动都是调用了这两个文件的不同方法,从而实现安卓和苹果为同一个布局和逻辑。
wow~ ⊙o⊙,好厉害的说,快让我看看iosApp里是什么东西。ヾ(≧▽≦*)o
好吧,果然是iOS项目,当然这个我就看不懂了,好像kotlin,哈哈,好吧,我发现有MainViewController,这个应该就是在调用刚刚看见的ios.kt那个文件的函数。
那么也就是说,androidApp和iosApp依赖于,shared中的androidMain和iosMain,而它们两又依赖于commonMain,算是了解了。
kotlin神奇的关键字
expect,actual的关键字我很少用,但是在跨平台开发中或许会变得常见,expect修饰的这个方法没有实现,而是在安卓和iOS模块中使用了actual,来实现了这两个方法,换句话说这个方法在不同平台下有不同的实现,这是非常令我惊讶的,居然还能做到这样!!!
OK,项目结构就说到这里了,我们打包就可以看到了
依赖不互通
前面我们提到了预览注解的问题,事实上这个问题并不是我们想的那样,如果我们尝试给commonMain的App函数加预览注解会发现这是没有的。
事实上这是有原因的,commonMain和androidMain的依赖并不互通,这导致了部分jetpack compose的组件和功能不可以直接在commonMain中使用。
原生交互
即使如此,我们也会发现iOS和安卓上有不能互通的,比如服务,内容提供器,对话框等目前Compose不支持而jetpack compose支持的组件。这样来说,我们就需要对苹果和安卓进行分别适配,怎么样?刚刚的关键字是不是起到作用了!!!
现在我们要给安卓和iOS的原生来适配对话框,各自都使用自己原生的,而不是compose,当然这只是一个例子,事实上compose完全可以做到这点。
设想一下,我们需要调用原生的对话框,假如在安卓这就需要context,但是commonMain中可没有这个东西,因此我们不能直接在androidMain中构建对话框,而是要将这个东西在activity和ios自己的活动里实现。
这里我们可以考虑用匿名高阶函数的办法来做,也就是说,我们可以在androidMain和iosMian中预留一个匿名函数,然后让activity传递这个匿名函数,当需要对话框展示时就调用这个匿名函数。
就是这样的方便和简单,事实上,和iOS的原生交互也可以这么做,只不过我没做iOS原生,不知道如何去实现,也没有mac,这极大的提升了跨平台的灵活性,非常棒。
如此,当动画播放时就会展示这个对话框啦
那么iOS就是自己原生的,这很棒很独特不是吗???
期望
希望compose可以加把劲发展,跨平台在compose的优势太明显了,kmm+jb-compose也许会是未来主流,这两天在compose跨平台看到了许多,我很高兴能了解前沿技术。
最后,希望安卓开发者也能参与其中,了解compose。
发表回复