Flutter:枚举的缺点
学习Flutter也有七八月时间了,从最初边看他人的Demo边CV战士学习,到写玩安卓的Demo,再到尝试将公司的项目使用Flutter化,或多或少有一些心得体会,我争取在闲余时间记录下来,大家一看笑之。
聊到Flutter,我们经常会聊它是什么,也经常会搬出下面这张图:
通过状态更新UI,这就是Flutter在更新UI时的本质,无论是使用setState,抑或使用框架,我们绕不开的是状态。
状态是什么?我认为状态其实就是枚举,你的界面有多少种状态,你其实就应该使用枚举状态去接收它。
我们先讨论这样一个场景,进入一个页面需要做网络请求,会有加载(菊花转,网络请求)、请求成功(成功有内容的展示页面或者没有内空白页面),请求失败(失败页面)。
按照上图,在Swift中我会如下编写枚举
enum ResponseState {
case loading
case success(ResponseStateSuccess)
case error
enum ResponseStateSuccess {
case hasContent
case empty
}
}
Kotlin不用多说,Swift有的,它都有,枚举中传参也是家常便饭,枚举编写的方式几乎和Swift一模一样。
而在Dart下,我只能这么写
enum ResponseState {
loading,
successAndHasContent,
successAndEmpty,
error
}
哪种编写方式更科学,更符合思维逻辑,不言而喻。
Flutter将Dart作为编程语言,考虑的是JIT与AOT齐飞的优势,不过Flutter是响应式的状态绘制UI的框架,其枚举的羸弱,让Swift与Kotlin的惯用者只能叹息一声。
缺少枚举带参,看起来在开发中没啥太大问题,我们可以通过工具类Utils或者枚举分类(幸好Dart的枚举还能扩展方法)去一定程度的缓解。不过回想一下还是让人有点心里痒痒,在我灵活运用状态去更新页面的时候,Dart的枚举却在绊脚。
至于Swift与Kotlin的枚举,都更加符合现代编程。Swift支持带参,遵守协议,与值类型的继承等。
也不能全怪Dart,毕竟它推出的时候才2011年。
目前Flutter团队正在为Dart添加Null Safe的功能,其实这个就是Swift中的可选类型,Kotlin也有对应的思路,就我个人经验而言,一旦了解的可选类型的机制,会让因为null导致的问题降低很多,并且代码更为严谨。目前Dart在为此做努力,也是好事。
希望啥时候也将枚举的功能增强一下吧。
转载自:https://juejin.cn/post/6908628153241960455