本文正在参与「金石方案 . 瓜分6万现金大奖」
前语
我之前写过2篇文章:
UI = f(State),在Swift中的一点思考
Flutter:枚举的缺陷
一来论述了所谓状况构建UI的重要性,一起也吐槽了作为以状况构建UI的Flutter在枚举方面缺陷,无法带入参数,导致无法将状况和数据一起去驱动页面。
这不Dart2.17不就支撑枚举支撑成员特点,我这一年都在做原生开发,好久没有做Flutter开发的我而言,最近体会了一下这个功用。
比照Swift,说说我使用的感受。
当然,Dart与Swift本身就是两门言语,咱们权当是我自己吐槽文娱。
枚举支撑成员特点,过于呆板,不够灵敏
咱们先来看看一个Dart的比如:
enum Water {
frozen(0),
lukewarm(40),
boiling(100);
final int temperature;
const Water(this.temperature);
}
一旦支撑成员特点,每一个枚举都必须带参数
其实很多时分,并不是每个枚举状况都需求带入参数,
比方上面的比如,我想加一个hot状况,可是hot状况我并不想明确具体温度,可是这么界说是不行的:
温度非加不行,不加就报错。
能够将final int temperature;
改写成为final int? temperature;
,将hot状况改成hot(null)
,但怎么看,都觉得怪怪的。
比照Swift,这个简直是小case:
enum Water {
case frozen(Int)
case lukewarm(Int)
case boiling(Int)
case hot
}
成员特点无法修正
咱们都知道,水的沸点在不同的气压下面就有所不同,所以上面这个boiling(100)
过于理想。
于是乎我想这么创立一个变量:
var status = Water.boiling(98);
可是,实际却是:
枚举能够带参,可是不能改动参数的状况,这点和Swift比,却是过于呆板了:
let status = Water.boiling(98)
单就比照这两点,我就关于Dart的枚举就无感了,虽然有了支撑成员特点的这个功用,可是离我想要的功用,还有很远,诸如写出下面这样的枚举状况,仍是无法完成:
enum ResponseState {
case loading
case success(ResponseStateSuccess)
case error
enum ResponseStateSuccess {
case hasContent
case empty
}
}
最终勘误一下自己之前文章里面的错误:
Kotlin不用多说,Swift有的,它都有,枚举中传参也是家常便饭,枚举编写的方法几乎和Swift千篇一律。
特地去看了Kotlin的教程,发现Kotlin的枚举与Dart千篇一律,在这两种言语中,枚举都是一个class!
Kotlin的枚举:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
有兴趣的同学能够看看Dart的源码,在/core/enum.dart
文件。
顺带说明一下Dart空安全,解包也十分不好用
别的Dart虽然关于空安全做了支撑,关于咱们编写代码的时分,咱们需求严谨的界说特点,这点当然是功德,可是在解包的时分,就让人有点跪了。
比方下面这段代码:
class Person {
String? firstName;
String? lastName;
Person(this.firstName, this.lastName);
String? get fullName {
if (firstName != null && lastName != null) {
return lastName! + firstName!;
} else {
return null;
}
}
}
firstName和lastName都是可选类型,我只能经过!= null
对其做了判空处理,在进行拼接的时分,我也只能经过!
对做强制解包进行运算,然后在if
条件语句中我现已经过!= null
保证了变量不行能为空,可是假如和Swift与Kotlin的判空与解包比起来,Dart的书写体会真的的是太差了。
class Person {
var firstName: String?
var lastName: String?
var fullName: String? {
/// Swift 5.7之前
if let firstName = firstName, let lastName = lastName {
return firstName + lastName
} else {
return nil
}
/// Swift 5.7之后
if let firstName, let lastName {
return firstName + lastName
} else {
return nil
}
}
}
总结
怎么说呢,有总比没有好。
Dart这个枚举支撑成员特点关于静态值的支撑仍是不错,能少写一些代码就少写一点。
一起,将两门不同的言语这样进行比照也不算友好,就好像拿一方的短处去比照另一方的利益一样。究竟Dart优势是罕见既能JIT又能AOT编译的言语,总不能要求面面俱到吧?
我也期望Dart能越来越好啦,这样一份逻辑我就能够无缝CV啦。
参考文档
Kotlin 枚举类
自己写的项目,欢迎咱们star⭐️
RxStudy:RxSwift/RxCocoa结构,MVVM形式编写wanandroid客户端。
GetXStudy:使用GetX,重构了Flutter wanandroid客户端。
本文正在参与「金石方案 . 瓜分6万现金大奖」