嘿,朋友!👋
还记得咱们以前老是为"哪种框架才是坠吊的"吵得不可开交吗?这回,我终于干了件每个开发者都放过狠话、但从来没真干过的事:我用 Flutter、SwiftUI 和 Jetpack Compose 把同一个界面撸了出来------而且全都严格遵循了 Clean Architecture(整洁架构) 原则。
欢迎关注我的微信公众号:OpenFlutter
说实话,最后的结果真把我给惊到了。
为什么这篇文章值得你看(没错,说的就是你)
听着,我懂。你点进来多半是因为:
- 你正陷入"框架焦虑(FOMO)"中,急需定夺到底学哪一个;
- 老板问你"咱们项目用哪个好?",你当时就慌了;
- 你是个 Flutter 开发者,总惦记着隔壁的草是不是更绿一些;
- 你要去面试了,想在聊跨平台开发时显得更有深度;
- 你心里其实已经选好了,就指望我能夸夸你的选择(剧透一下:没准儿真会哦)。
不管你是为了啥来的,我保证这不是那种"Hello World"级别的流水账。这是一个刚熬了三个通宵,在状态管理、依赖注入以及"等等,我这层数据到底怎么传给下一层来着?"这些地狱级难题里反复横跳后的真实感悟。
终极挑战:一个界面,三套框架,拒绝借口
我做的是一个实战级别的"用户个人资料"页面,毕竟现在谁还稀罕看计数器(Counter App)啊?这玩意儿包含了:
- 真实的远程 API 调用(带报错处理的那种);
- 真正管用的本地缓存;
- 不至于丑得像垃圾一样的加载状态;
- 严谨的 Clean Architecture 划分(UseCases, Repositories,一个都不少);
- 不会让你想摔电脑的路由导航。
同样的设计,同样的架构,同样的功能。但实现它的过程,却是三种截然不同的体验。
我的实测体会(那些官宣里不会告诉你的事)
1. Flutter:真香,它是真的能干活
Flutter 最让我感到莫名的爽感的一点是:它居然...真的能跑?而且是哪儿都能跑。
我只写了一套代码,它就能完美运行在我的 iPhone、安卓测试机,甚至 是网页浏览器上,而且我还没给编译器大神"烧香"。它的 Hot Reload(热重载) 快到离谱,刚开始我甚至以为它坏了------按下保存,修改立现。没有编译等待,没有漫长加载。这种生产力,简直是纯粹的享受。
Clean Architecture 的搭建过程也意外地顺滑。用 get_it 做依赖注入?简直绝了(Chef's kiss) 。这种目录结构让你觉得,这框架的设计者是真的考虑过开发者的心路历程的。
但反转来了: Dart 这门语言有点怪。它不差,只是...异类。如果你习惯了 Kotlin 或 Swift,你头一周肯定会反复纠结:"为什么这儿要写下划线?"以及"这个 late 关键字到底是个什么鬼?"
2. SwiftUI:果粉的快乐(但仅限果粉)
用 SwiftUI 开发就像开特斯拉:顺滑、极具未来感,但一旦你离开了它的生态圈,偶尔会觉得心累。
它的声明式语法太漂亮了 。真的,写下 @State 然后看着 UI 自动更新,简直像在施魔法。那种只加一个 .animation() 就能搞定动画的感觉?凌晨两点,我在空无一人的公寓里忍不住叫了声"哇塞"。
但在 SwiftUI 里搞 Clean Architecture,事情就开始变得"复杂"了。SwiftUI 强迫你用 Combine 或 async/await(这本身挺好),但紧接着你就要处理各种 Publishers 和 Cancellables,搞得你的 ViewModel 看起来像飞船仪表盘一样。
最扎心的一点? 仅限 iOS(行吧,还有 macOS 和 watchOS,但你懂我意思)。你那一套漂亮的代码只能留在苹果的"后花园"里。没安卓,没网页。有的只是优雅的格调和高耸的围墙。
3. Jetpack Compose:安卓开发者的"救赎之路"
如果你曾深受 XML 布局的折磨,那 Compose 就像是沙漠里的甘露。Google 终于搞清楚开发者到底想要什么了。
Composable 函数写起来直观得一塌糊涂。全是 Kotlin,这意味着如果你懂 Kotlin,你就已经掌握了 70%。预览系统也很稳(前提是 Android Studio 决定配合你,不过绝大多数时候它还挺乖)。
Clean Architecture 实现? 确实很干净。Kotlin 的协程(Coroutines)让异步操作变得非常自然。用 Hilt 做依赖注入的集成极其丝滑,你会纳闷 Google 为什么花了这么多年才开窍。
但那头"房间里的大象"依然存在: 它目前基本只属于安卓。虽然 Compose Multiplatform 已经出来了,但咱们说实话------它还没到那种谁都能直接拿来跑生产环境的程度。你现在入坑,赌的是未来。
代码大对决(动真格的了)
来看看这段让我直呼"好家伙"的部分:在三套框架里分别实现同一个 UseCase。
Flutter (Dart):
dart
class GetUserProfileUseCase {
final UserRepository repository;
GetUserProfileUseCase(this.repository);
Future<Result<UserProfile>> call(String userId) async {
return await repository.getUserProfile(userId);
}
}
代码点评: 干净、简洁、异步优先。这个 call() 方法意味着你可以像调用函数一样直接运行它。这就是典型的 Dart 范儿(Dart vibes)。
SwiftUI (Swift):
swift
protocol GetUserProfileUseCase {
func execute(userId: String) async throws -> UserProfile
}
class GetUserProfileUseCaseImpl: GetUserProfileUseCase {
private let repository: UserRepository
init(repository: UserRepository) {
self.repository = repository
}
func execute(userId: String) async throws -> UserProfile {
try await repository.getUserProfile(userId: userId)
}
}
这个 async throws 写法简直美如画。Swift 的类型安全机制强得惊人,但同时也意味着会有更多模板代码(Boilerplate)。就看你更中意哪一个了(Pick your poison)。
Compose (Kotlin):
kotlin
class GetUserProfileUseCase @Inject constructor(
private val repository: UserRepository
) {
suspend operator fun invoke(userId: String): Result<UserProfile> {
return repository.getUserProfile(userId)
}
}
那个 operator fun invoke?简直是神来之笔(Chef's kiss) 。Kotlin 的简洁性让我的大脑极其舒适。再加上 Hilt 的 @Inject,依赖注入这件事变得像呼吸一样自然。
诚实豆沙包:到底什么才重要?
在把同一个功能写了三遍之后,我总结出了一些能真正帮你做决定的建议:
-
选 Flutter,如果:
- 你需要快速推向多个平台。
- 你的团队懂 Dart(或者愿意学点新东西)。
- 你把开发体验和热重载(Hot Reload)看作生命线。
- 你在搞创业,恨不得昨天就能把 iOS + 安卓 + Web 版全上线。
- 你不介意 Dart 的生态没有 Swift/Kotlin 那么"国民级"。
-
选 SwiftUI,如果:
- 你只打算在苹果的生态里混。
- 你追求极致的 iOS 原生质感和性能。
- 你的团队已经是 Swift 老手了。
- 你爱"类型安全"胜过爱你的家人。
- 你能接受最低系统要求是 iOS 14+(那些老机型用户只能说声抱歉了)。
-
选 Compose,如果:
- 你是安卓优先(或者目前只做安卓)。
- 你的团队是 Kotlin 死忠粉。
- 你想逃离 XML 布局的"创伤",拥抱现代安卓开发。
- 你愿意在 Compose Multiplatform 的未来上赌一把。
- 你非常心水 Material Design 3 那种丝滑的集成感。
聊聊性能(毕竟总有人爱问这个)
说句实在话:对于 90% 的应用来说,性能差异几乎可以忽略不计。 你的用户发现不了,你的老板发现不了。甚至你自己也发现不了------除非你在写什么极其复杂的玩意儿。
但既然要比,那就拆开说:
- Flutter: 编译成原生代码。快,丝滑的 60fps。Skia 渲染引擎已经经受了时间的考验。
- SwiftUI: iOS 亲儿子。快。有时候在优化上显得"聪明过头"了(没错,说的就是那些神秘的视图更新逻辑)。
- Compose: 安卓亲儿子。快。Kotlin 的运行时已经非常成熟且经过深度优化。 真正的性能瓶颈通常出在你的代码上,而不是框架。 很扎心,但这是事实。
开发体验(DX)的真相
有一点没人会告诉你:对于大多数项目来说,开发体验(DX)比原始性能更重要。
- Flutter 赢在: 热重载速度(真的,快到没朋友)、跨平台的一致性、极其丰富的插件生态(pub.dev 是座宝库)、文档质量(Flutter 的文档堪称行业标杆)。
- SwiftUI 赢在: IDE 集成度(Xcode 虽有槽点,但它是为 Swift 而生的)、类型安全和编译时纠错、Xcode Previews 预览(只要它不抽风)。
- Compose 赢在: Kotlin 强大的语言特性、Android Studio 的深度整合、Material Design 的官方实现、以及那种"终于永远删掉 XML 文件"的解脱感。
社区现状(这关乎你的饭碗)
聊聊找工作和社区,毕竟大家都要吃饭:
- Flutter 岗位: 增长极快。初创公司最爱,大厂也在观望。社区极其活跃且乐于助人。FlutterFlow 甚至让很多不写代码的人也开始入坑了。
- SwiftUI 岗位: 在专注于苹果生态的公司里非常稳。想进大厂做 iOS,SwiftUI 是必修课。薪资普遍偏高,因为 iOS 开发一直自带溢价。
- Compose 岗位: 现在的安卓岗位几乎都要求会 Compose。如果你精通 Compose,你就是安卓职场上的"独角兽"。各家公司都在从 XML 迁移,急需大腿。
我的真心推荐(我知道你们都在等这一段)
如果明天要开个新项目,只能选一个?
我会选 Flutter。 在 SwiftUI/Compose 的粉丝开喷之前,听我解释: 一套代码搞定 iOS、安卓和 Web,这个价值实在太诱人了。它的开发体验始终如一地出色,社区充满活力,插件生态也已经熟透了。说真的,光是一个"热重载"省下来的时间,就足以抵消学习 Dart 的成本了。
但是(划重点):
- 如果你只给 iOS 写 App?选 SwiftUI,别犹豫。
- 如果你只给安卓写 App?选 Compose,冲就完了。
- 如果你是在现有的原生 App 上修修补补?老老实实守着原有的技术栈。
关于架构的惊喜
有一点挺出乎意料:Clean Architecture 在 Kotlin/Compose 里感觉最自然。 Kotlin 的语言特性(密封类、协程、数据类)跟整洁架构原则简直是天作之合。Flutter 紧随其后。而 SwiftUI 则需要你跟协议(Protocols)和类型系统进行最多的"搏斗"。 但核心结论是:这三者都能完美适配架构。 这种原则是超越框架的,不管你写的是 Dart、Swift 还是 Kotlin,你的领域层(Domain Layer)看起来都应该差不多。
这对你意味着什么?
能看到这儿,你不是在摸鱼,就是真的感兴趣(或者两者都有,我懂,我也经常这样)。
基于这次实验,我的建议是:
- 如果你是学生/新人: 学 Flutter。练好 Dart,多动手做东西,发布到多个平台。攒一个能证明你具备"交付产品能力"的作品集。这种跨平台能力会让初创公司对你垂青有加。
- 如果你是 iOS 开发: 还没学 SwiftUI 的赶紧学。但也建议你在业余项目里试试 Flutter,感受一下跨平台到底在火什么。
- 如果你是安卓开发: 搞定 Compose。同时盯着点 Compose Multiplatform。未来的发展会非常有趣。
- 如果你是做决策的技术 Leader: 看看你团队的技能树、项目工期和目标平台。其实选这三个里的任何一个都能做出成功的 App。框架选型的重要性,远不如团队的执行力重要。
那些让我彻夜难眠的坑
分享几个我踩过的坑,希望能帮你省下几个小时:
- 状态管理: 三个框架各有 47 种管理状态的方法。我最后选了 Provider (Flutter), Observable/Combine (SwiftUI) 和 ViewModel (Compose)。都行得通,但也各有各的小脾气。
- 导航: Flutter 的路由很直观;SwiftUI 的 NavigationStack 现在好多了,但以前真是折磨;Compose 的 Navigation 组件很稳,就是代码有点啰嗦。
- 测试: 都支持测试,但 Flutter 的 Widget Testing 感觉最成熟。SwiftUI 的预览测试很酷。Compose 的测试最全面,但配置起来稍麻烦。
最后的一点感言
说到底,这些都只是工具。你用它们造出了什么,才最重要。
我见过这三个框架分别写出的惊艳 App,也见过三个框架分别写出的垃圾。框架不能决定 App 的好坏,你才能。
选一个,深挖下去。做个让人惊艳的东西。然后再去学下一个,或者干脆不学,都没问题。这里没有标准答案。
轮到你了(该你发言了)
来,咱们评论区见:
- 你是 Flutter 铁粉? 用它做出了赚钱的项目?来分享一下你的故事,社区需要真实的回馈。
- 刚入坑移动开发? 随便问,这里的社区氛围很友好。
- 职场老司机? 传授点面试经验。你招人时最看重什么技能?
- 遇到瓶颈了? 把你的烦心事说出来,没准儿评论区就有大神帮过你解决了。
无论你是刚起步,还是已经发布过 10 个 App 的 Flutter 大佬------你都很棒。继续写码,继续学习。你的下一个 App 没准儿就能改变世界。
致所有的移动开发者: 给刚入行的新人留句鼓励的话吧。大家都经历过萌新阶段,让这个圈子更温暖一点。
最后一句话
我花了 72 小时做这个对比,就是为了让你不用再纠结。不管你是 Flutter 党、SwiftUI 党还是 Compose 党,我们其实都在干同一件事:做点酷的东西,让别人觉得好用。
选好你的框架。写出整洁的代码。发布你的 App。无视那些喷子。 记住:最好的框架,是那个能让你真正把项目做完的框架。
别看了,快去写代码吧!🚀