文章

跨端UI开发体验之我见:Flutter、Compose及MAUI可视化横评

跨端UI开发体验之我见:Flutter、Compose及MAUI可视化横评

在当前的跨平台开发浪潮中,不同的UI框架为开发者带来了多样的选择和体验。本文将结合个人观察与实践,对 Flutter、Jetpack Compose(作为Android现代UI的标杆)以及 .NET MAUI 在UI构建、预览编辑及热重载等核心环节进行一番比较。


Flutter:热重载的极致与“UI即代码”的坚持

Flutter 以其 Dart 语言驱动的“UI即代码”理念和强大的热重载机制,在开发者社区中获得了广泛关注。

  • UI 定义与渲染的自主性: Flutter 通过自有的 Skia 渲染引擎直接绘制UI,确保了在各个平台上的高度一致性。这种方式虽然赋予了开发者对像素的极致控制权,但也意味着它无法像 Android 原生XML那样,由IDE进行非常直接的可视化交互编辑。Skia 对于 Android Studio 而言可能像一个“黑箱”,这或许是深度可视化集成的一个挑战。

  • 热重载:为何还需要繁琐的可视化编辑? Flutter 的热重载功能非常出色,不仅速度快,而且能够保存应用状态,让开发者几乎可以即时看到代码修改带来的UI变化。这种高效的反馈机制,在很大程度上降低了对传统所见即所得(WYSIWYG)编辑器的依赖性。当代码修改能如此迅速地反映出来时,对于很多开发者而言,直接在代码中构建和调整UI反而更为直接和高效。也曾有想法,是否可以通过运行一个轻量级的Dart编译服务来辅助预览,但或许正是因为热重载的强大,这种需求显得不那么迫切了。


Compose Multiplatform :“UI即代码”的现代化尝试

Jetpack Compose 代表了 Android UI 开发的未来方向,它同样采纳了声明式的“UI即代码”思想,但其在工具链整合上展现了独特优势。

  • Kotlin驱动与现代UI范式: Compose 使用 Kotlin 构建UI,开发者可以更专注于UI逻辑的表达,而无需像过去那样依赖XML进行布局(尽管App Widgets或字符串资源等场景仍会使用XML)。

  • “相当不错”的预览与编辑体验: Compose 在 Android Studio 中的预览功能的确挺不错的,能够支持多种样式(如不同主题、屏幕尺寸、夜间模式等)的即时预览。这很大程度上得益于 @Preview 注解这样的“入口”机制,IDE能够识别并独立渲染这些Composable函数。 加上交互式预览和字面量实时编辑等功能,使得UI调试和微调变得非常便捷。可以说,Kotlin (Jetpack Compose) 的这套实现方式,全靠JetBrains的努力,使得其IDE和语言的深度整合。


.NET MAUI:XAML的传统与“不那么现代”的热重载

.NET MAUI 作为 Xamarin.Forms 的后继者,旨在通过 C# 和 XAML 实现跨平台的原生应用开发。

  • XAML与C#分离的模式: MAUI 延续了XAML用于UI布局、C#用于业务逻辑的开发模式。这种模式对于熟悉 .NET 桌面开发的开发者而言可能较为自然。

  • 备受诟病的热重载: 然而,在热重载这一提升现代开发体验的关键环节上,MAUI 的表现不尽如人意。热重载真的和垃圾一样。尤其是在进行组件结构性变更(如增删UI元素)时,非常容易出现连接丢失、布局不变(删除的组件区域变为空白且无法选中)等问题,或者干脆提示不支持热重载,强制要求重新构建。

  • “现代框架”的疑问: 这种不甚流畅的热重载体验,加上仍在坚持XAML与C#代码分离绑定的做法,我觉得 MAUI 这就不是现代的框架。


一些碎碎念:

  • 官方的轻视和掌控欲: Google对flutter的态度有些矛盾,也进行了裁员,flutter的未来有些不明朗,对compose似乎更加青睐。早年间尝试集成Chrome 浏览器中,但是放弃,自己的操作系统Fuchsia OS也迟迟没有推出,其官网页面还是旧版本MD样式,可见多不上心。 Flutter的官方文档和社区支持也显得有些薄弱,很多问题需要开发者自己摸索解决。 Google对flutter的掌控欲很强,不愿接受社区的贡献,致使开源分支Flock的出现。

  • Flutter的生态: 虽然Flutter有pub.dev收集了大量的第三方库和组件,但在一些特定领域(如图形处理、机器学习等)仍然显得有些薄弱,而且第三方库的质量参差不齐也容易因为Flutter版本更新而导致不兼容的问题,没有及时更新插件。 从Dart3.5以下版本(Flutter 3.22.3 及以下)升级到3.5以上版本时,很多插件都需要更新才能兼容新的Dart版本。比如

    1. image_gallery_saver 这个插件已经 23 个月没有更新了,在其 issue中,发现了新插件 flutter_image_gallery_saver 可替代或者使用在pub.dev查找到的image_gallery_saver_plus。(本插件实际函数使用方式不变,函数名变化)

    2. 谷歌官方负责维护的tflite_flutter插件也有较长时间没有适配,且当时暂时无法找到优秀替代。 以上种种导致了Flutter变成了安卓开发的“二等公民”,除了安卓接下来可能是对iOS的支持排名第二,再者都是聊胜于无的支持,甚至于Dart的口号:“目标在于成为下一代结构化Web开发语言”也是空谈。

结语:

总结来看,各个框架在UI开发体验上各有侧重:

  • Flutter 以其极致的热重载和自绘引擎带来的高一致性为主要卖点,但在传统可视化编辑上有所取舍。
  • Jetpack Compose 则凭借 JetBrains 强大的IDE支持和语言整合,在“UI即代码”的同时提供了令人印象深刻的预览和编辑辅助。
  • .NET MAUI 虽然提供了 .NET 开发者熟悉的XAML模式,但在热重载等关乎现代开发效率的环节上,尚有较大提升空间。

PS:好像没有提到React Native之类的Web框架,因为可能有对Web性能的担忧,再者也没有接触,以后可能会试着接触再进行评价。

本文由作者按照 CC BY 4.0 进行授权