Flutter和Compose的区别和选择

杨坚强

由于看到谷歌在近期大力推广Jetpack Compose进行Android开发,下意识联想到目前正火的Flutter。之前了解到JetBrains有推出基于Jetpack Compose针对桌面平台的图形界面解决方案JetBrains Compose for desktop。出于对两种跨平台方案的选择困难,今天就大概研究了一下两种方案之间的区别,当然要提一句,受限于本人的技术水平和对两种技术的了解,文章仅表示本人的大致理解和分析。

如果你了解过Flutter相关的知识,就会了解到,Flutter屏蔽了不同操作系统底层的图形界面API,直接利用skia引擎进行图形界面的绘制,类似于提供一个可以在各个平台上运行的画板,让你在上面作画,因此能够做到同一套UI代码在全平台都能编译呈现同样的效果,合理使用某些包和插件甚至可以进行小部分跨平台的简单业务逻辑的开发。同样的,Compose的图形界面绘制部分也是由skia引擎完成。本以为和Flutter一样,是同一套代码跨平台绘制,但是浏览Compose在Github上开源的示例代码后,我发现并非如此。使用Compose开发需要为每个平台的主图形界面部分独立地编写代码,例如在Android上是绘制Activity,而到了桌面系统就要绘制Window,因此其通用部分仅是业务逻辑以及内容组件部分,如处理逻辑、按钮、图片视图之类。这样做虽然增加了图形界面的编写成本,但其好处就是可以调用每个平台不同的图形界面本地特性,在Android上可以使用长按来呼出上下文菜单,到了desktop就可以转而使用右键监听事件,可以在保证业务逻辑编写一次的情况下还具有针对不同平台进行布局和操作逻辑处理的灵活性,而这一点Flutter本身就很难实现,其需要用到第三方开源库NativeShell来调用桌面环境下独有的API,远不如Compose来的灵活,并且该库目前还处于实验期,未来的发展很难预测。当然,你也可以通过FFI来使用其他语言对接不同系统的特定API,但是这就失去了跨平台的能力。

在使用过程中,我还发现Flutter在桌面端对hidpi的支持比较好,能够随系统设置一起正确缩放,但是Compose目前在Linux上还不能正确缩放,包括Wayland和X11都不行,在4K屏幕上图形界面元素会变得非常小。

综上所述,目前两者都使用skia引擎进行绘制,但区别是Flutter属于一个画板,你可以用Dart在上面任意画画,但实现其他大部分功能需要使用Dart或者进行FFI调用,然而Dart的生态比起其他语言来说实在是捉襟见肘,因此一般仅用来进行图形界面的编写,而且进行图形界面编写的时候多层嵌套常常令人头痛;Compose则属于一套工具箱,里面有针对各个平台的各种工具,然后也有一个画板,驱动工具箱中所有东西的方式为Kotlin,而Kotlin背靠强大的Java/JVM生态,拥有用不完的工具库以及近乎变态的跨平台发展势头(iOS除外),但目前还处于Alpha阶段。

因此通过比较,我个人更倾向于学习和使用Compose,也希望这篇文章对你的选择有所帮助。

阅读 607

热爱技术

2 声望
1 粉丝
0 条评论
你知道吗?

热爱技术

2 声望
1 粉丝
宣传栏