从 iOS 到 Flutter,我用了2天时间

166 阅读4分钟

(本文技术性术语较多,比较适合有技术背景的同学阅读)

在之前的文章我说过,大龄失业的我,决定创业,开发了一个iOS版本的口语外教App - 《星空外语》。因为我曾经是一个 iOS 开发人员,所以就用自己熟悉的技术,快速的做了一个 MVP 版本。让人欣慰的是,用户普遍反馈 App 好用,简单丝滑。还有很多同学在咨询有没有安卓版本。

安卓的市场份额,不管是国内还是国外,都是遥遥领先于苹果。安卓同学的热情,让我思考当初技术路线的选择不够谨慎。在资源这么紧张的情况下,一开始就需要选择跨平台的技术,而不是用 Native,否则多端的开发成本是无法承受之重。既然要选择一个跨平台技术,那选择怎样的跨平台技术呢?我把我考虑的重点放到这个表格之下:

React NativeFlutterKotlin Multiple Platform(KMP)
背后大佬MetaGoogleGoogle
语言Typescript(解释型 + 编译类型检查)Dart(编译型)Kotlin(编译型)
跨平台视图成熟:适配各自平台的组件,可能有些许不一致成熟:Flutter 的视图都是自己绘制,不依赖于平台的组件库,可以最大限度的做到多端一致不成熟:依赖于 Compose Multipleform,目前 iOS 还没有 Release 版本
性能足够(JSI 已经不需要通过序列化和反序列化与Native 进行通讯,减少性能损失)优秀Native 级别
动态更新成熟理论上支持不支持
鸿蒙适配理论上支持

以我个人的技能树,我是做过 Typescript 的,也做过 RN,选择 RN 可能是更顺理成章的事情。但是最后我选择了 Flutter,主要的理由如下:

  1. Flutter 的视图是自己绘制的,所以可以很好的做到多端一致,后续如果支持鸿蒙,也不会需要做太多的适配(我很害怕适配UI,会在很多细节上浪费非常多的时间)
  2. Dart 这门语言看起来足够简单,没有太多历史包袱,简洁高效。
  3. KMP 看起来很适合我,我也喜欢 Kotlin 语言,但是它真的还不够成熟。它更适合把已有的 Kotlin 代码移植成跨平台方案。

最终还是带着个人偏好,我选择了 Flutter 作为星空外语的跨平台技术方案。

学习一门新的技术,最好的地方是官网。带着问题,到官网找答案。感谢完善的 Flutter 文档,作为一名曾经的 iOS UIKit 开发人员,看了 Flutter for UIKit developers,已经把一个 iOS UIKit 开发人员关心的问题讲的非常清楚了。同时,每个平台都会有非常好用的第三方解决方案,通过咨询相关 Flutter 同学,我整理如下:

官方解决方案第三方解决方案
视图更新数据驱动,这个与 React Native 非常像,也跟微信小程序非常像。大概原理就是监听一个数据对象,通过对数据对象的更新,反馈到UI的更新GetX可以看作 iOS 的ReactiveCocoa 或 RxSwift,但是又没有那么复杂
路由官方提供基于路径的路由Get
数据库sqflite
日志printfLogger
网络请求httpdio (支持 interceptor)
本地化i18nGet
JSON 序列化Dart 的 JSON 序列化和反序列化,没办法做到像 Java 那样,至于为什么,可以看这个文章: docs.flutter.dev/data-and-ba…json_serializable + shell 脚本
异步请求Async await 模式,类似 JS。(它跟 coroutine 有什么不一样?)
打点监控Firebase

Flutter 的 Get 库真是简单又强大,可以让你梦回 iOS 开发。你看,换语言,换平台,是不是没有什么不一样?技术都是相通的。

从开始看官方文章,到配置好环境,我花了两天时间,于是我开开心心的写代码了。什么?Dart 需要在编译时就确定变量是否可空?可以可以,这个避免 NPE。哦,mixin 和 extension 什么区别啊?每次遇到问题,我都去看看相关的文章,把一个一个疑惑解决。

一个月后,我们的星空外语安卓 MVP 版本开发完成了。所以很多时候,我觉得面试考察的不应该是八股文。一个程序员,最重要的是基本功。操作系统原理、网络安全、数据库原理等等,而不是考你茴字有多少写法。

同时,也祝各位客户端开发人员(我知道现在太难了),不要局限自己,前程似锦!