imcys.com
遵从中二的召唤,来吧少年!

【前沿】Compose for iOS正在Alpha中!

前言

最近的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。

萌新杰少

文章作者

I im CYS,一个热爱二次元的大专开发者

发表回复

textsms
account_circle
email

Captcha Code

萌新杰少の秘密基地

【前沿】Compose for iOS正在Alpha中!
最近的compose是不是发的太多了?哈哈,当然这也是因为对它有很大的期待吧,就在前不久,在荷兰的会议上,Compose for iOS进入了我们的视野。事实上Compose for iOS之前我们也见过,但是存在一个问题,就是布局得用iOS的写法,但逻辑可以给Android和iOS共享。
扫描二维码继续阅读
2023-06-26