本文正在参与「金石方案 . 瓜分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状况我并不想明确具体温度,可是这么界说是不行的:

Dart:枚举支持成员属性,并不好用

温度非加不行,不加就报错。

能够将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);

可是,实际却是:

Dart:枚举支持成员属性,并不好用

枚举能够带参,可是不能改动参数的状况,这点和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万现金大奖」