Express Flutter SDK 全面支援空安全

ZEGO即構發表於2021-08-03

Flutter 是一套移動 UI 框架,可以快速在 iOS、Android 上構建高質量的原生使用者介面。作為其官方語言 Dart 是型別安全的,當開發者獲取變數的時候,編譯器可以保證變數的型別,但型別安全並不保證獲取的變數不是null

在 GitHub 上有非常多因為null導致 Dart 程式碼出現異常的 issue,為了從源頭上解決 Null errors,Dart 團隊在 2.12 版本中支援空安全(Sound null safety)特性,相應的 Flutter 升級到了 2.0。

詳解空安全特性

當選擇使用空安全時,程式碼中的型別將預設為非空,意味著除非你宣告它們可空,它們的值都不能為空。有了空安全,原本處於執行時的空值引用錯誤將提前到編譯期。

為了支援空安全特性,Dart 新增了操作符和關鍵字:

?           -> 可空               如:int a?;
!           -> 非空               如;int b = a!;
late        -> 延遲初始化          如:late int a;
複製程式碼

下面我們以 Express SDK 支援空安全為例,對以上操作符和關鍵字進行逐個介紹。

1、操作符:?

在 Express SDK 的開發中,因為介面使用的便利性,我們會在介面中內建化一些預設值,同時如果開發者想使用高階的特性,可自行進行配置,那就需要引數是可空的,在型別後面新增 "?"即可:

loginRoom(String roomID, ZegoUser user, {ZegoRoomConfig? config})
複製程式碼

Express SDK 事件回撥一般都是用可選監聽的,所以定義回撥事件的方法時都是使用的"?",表示監聽可空。

static void Function(ZegoEngineState state)? onEngineStateUpdate;
複製程式碼

2、操作符:!

當我們在做事件回傳的時候,會對回撥方法做判空推出處理,保證後續的使用不會出現空值引用,可以使用"!"來告訴編輯器,這個值不會為空。

case 'onEngineStateUpdate':
    if (ZegoExpressEngine.onEngineStateUpdate == null) return;

    ZegoExpressEngine.onEngineStateUpdate!(
      ...  
    );
    break;
複製程式碼

3、關鍵字:late

當需要處理延時初始化這種常見的行為時,可以使用 "late" 來告訴編輯器,這是個非空變數,會稍後初始化。

class RTC {
    late ZegoExpressEngine engine;

    ZegoExpressEngine createEngine(appID, appSign, true, 0).then((e)) {
        engine = e;
        ...
    }
}
複製程式碼

空安全引入的優勢

這裡值得注意的是,我們的目的並不是為了消除 null,一個表示空缺的值是非常有用的。在語言中提供對空缺值的支援,可以讓處理空缺更為靈活和高效,它為可選引數、?. 空呼叫語法糖和預設值初始化提供了基礎 。

所以 null不是糟糕的,糟糕的它會在你意想不到的地方出現,最終引發問題。而空安全的引入是讓程式碼中 null 變得可見和可控,並且確保它不會傳遞到某些位置從而引發崩潰。

當語言對程式中語義化的屬性做出硬性保證時,說明編譯器能真正意義上為這些屬性作出優化,當它涉及到 null 時,意味著可以消除不必要的 null檢查,提供更精悍的程式碼,並且在對其呼叫方法前,不需要再校驗是否其為空呼叫。反映在在包體大小和效能提升方面都帶來了可觀的效果。

ZEGO Express Flutter SDK 已全面支援空安全

  鑑於空安全帶來的種種優勢,Express Flutter SDK 在 2.5.1 版本中對空安全已經進行了全面的支援。

  • Express Flutter SDK 2.5.1 及後續版本支援 null-safey,作為一個向後相容的特性,必須使用 Dart 2.12 或更高版本。

  • Express Flutter SDK 2.5.1 支援 Flutter 2.x (僅限與 Android 和 iOS 平臺)。

在 Dart 的包管理檔案 pubspec.yaml 中可進行配置:\

environment:
  sdk: ">=2.12.0 <3.0.0"
  flutter: ">=2.0.0"
複製程式碼

最後,如果您想深入理解空安全可參考Dart 官方文件:dart.cn/null-safety…

詳細瞭解 Express Flutter 的相關功能請參考 ZEGO 官方文件和示例原始碼:doc-zh.zego.im/article/542…

相關文章