檢查一下你的Flutter項(xiàng)目里有多少這樣的代碼
if(xxx != null && xxx.isNotEmpty)
不得不說奶赠,我真的不喜歡這種先想條件,然后再想著在外面包一層 if
這種逆著思維順序的代碼方式(畢竟大家都活在「TENET」的世界里??)擒贸,尤其 if 里的條件比較長的時(shí)候。
消滅 == null
眾所周知觉渴,dart 里有 ?.
和 ??
這種判空操作符介劫,于是上面的代碼可以簡化成這樣:
String a = "dart";
if (a?.isNotEmpty ?? false) {
print('??');
}
但是還是好麻煩吶
封裝一個(gè)擴(kuò)展函數(shù)試試
給常用的類型添加 isNullOrEmpty
擴(kuò)展函數(shù)
extension MapExtension on Map {
bool get isNullOrEmpty => (this == null || this.isEmpty);
}
extension IterableExtension on Iterable {
bool get isNullOrEmpty => (this == null || this.isEmpty);
}
extension StringExtension on String {
bool get isNullOrEmpty => (this == null || this.isEmpty);
}
好了現(xiàn)在我們可以這樣寫:
String a = null;
if (!a.isNullOrEmpty) {
print("??");
} else print("Shit");
但是還有一種場景是不處理 null 的分支,只處理 empty or notEmpty
把 Kotlin 的方案搬過來案淋,對(duì)bool類型加擴(kuò)展函數(shù)
先寫用法:
String a = "";
a?.isEmpty?.yes(() {
print("Yes!");
})?.orElse(() {
print("No! God No!");
})
如果你還是想要判斷空分支座韵,那還可以在后面加上??
看起來沒有 kotlin 那么美觀,但是至少不用寫 if 了踢京,代碼實(shí)現(xiàn)在下面??
class BooleanExt<T extends Object> {
T orElse(T block()) {
if (this is OrElse) {
return block() ?? Null;
} else {
return (this as WithData).data ?? Null;
}
}
}
class OrElse extends BooleanExt<Object> {}
class WithData<T> extends BooleanExt<T> {
final T data;
WithData(this.data);
}
extension BoolExtension<T> on bool {
BooleanExt yes(T block()) {
if (this) {
return WithData(block());
} else {
return OrElse();
}
}
BooleanExt no(T block()) {
if (this) {
return OrElse();
} else {
return WithData(block());
}
}
}
以上代碼都基于現(xiàn)在穩(wěn)定版的語法回右,不過前段時(shí)間 Dart 發(fā)布了一個(gè)實(shí)驗(yàn)特性,加入了空安全的完整版
新版 Dart 的「空安全」
新的空安全機(jī)制改得和 Kotlin 一樣了漱挚,直接分成「可空」和「不可空」兩大類型翔烁,一個(gè)變量允許賦值為null
就必須提前聲明為不可空類型,各位可以在 https://nullsafety.dartpad.cn/ 這里玩一下旨涝。
在新版空安全下蹬屹,上面的 isNullorEmpty
的實(shí)現(xiàn)和調(diào)用得改成這樣:
extension IterableExtension on Iterable? {
bool get isNullOrEmpty => (this == null || this!.isEmpty);
}
///
List<String>? a = null;
if (a.isNullOrEmpty) {
print("DOG");
} else {
print("Cat");
}
emmm,可以發(fā)現(xiàn)這個(gè)語言還是不太聰明的樣子白华,我明明前面都寫了 this == null ||
, 后面調(diào)用還是要加上 !
操作符強(qiáng)制認(rèn)定不為空慨默,在 Kotlin 里,這里就可以智能判斷弧腥,Kotlin 真香??厦取。
總結(jié)
Dart 雖然開始的時(shí)候比較簡陋,但是一直在進(jìn)步管搪,有了擴(kuò)展函數(shù)虾攻,有了嚴(yán)格的空安全铡买,下一步是不是可以考慮支持 DSL 語法了??