跳至主要內容

將 `of` 遷移至不可為空的傳回值,並新增 `maybeOf`

摘要

#

本遷移指南說明如何轉換使用各種靜態 `of` 函式從上下文中檢索資訊的程式碼,這些函式過去會傳回可為空的值,但現在會傳回不可為空的值。

背景

#

Flutter 有一種常見的模式,允許使用通常稱為 `of` 的靜態成員函式來查找某些類型的 Widget(通常是 InheritedWidget,但也包括其他 Widget)。

當不可為空成為預設值時,最常用的 API 傳回不可為空的值就變得理想。這是因為在呼叫 `Scrollable.of(context)` 之後,仍然需要 `!` 運算符或 `?` 以及回退值會讓人覺得很尷尬,而且不符合不可為空的 Dart 程式碼的慣用寫法。

當我們在先前的遷移中消除了 `nullOk` 參數時,就執行了許多這方面的遷移,但該遷移遺漏了一些 `of` 方法,並且後續添加的一些方法具有可為空的傳回型別,這與我們的常見模式背道而馳。

在此遷移中,受影響的 `of` 存取器分為兩個呼叫:一個傳回不可為空的值,並且在找不到所需值時會擲回例外(仍然稱為 `of`),另一個傳回可為空的值,並且不會擲回例外,如果找不到值則會傳回 null(一個名為 `maybeOf` 的新方法)。

變更說明

#

此變更將這些靜態 `of` API 修改為傳回不可為空的值。如果找不到值,它們現在也會在偵錯模式中斷言,並在發佈模式中擲回例外。

此變更還在上述函式旁邊引入了新的靜態 `maybeOf` API,這些 API 會傳回相同值的可為空版本,並且如果找不到值,則只會傳回 null,而不會擲回任何例外。

遷移指南

#

若要修改您的程式碼以使用新的 API 形式,請先將原始靜態 `of` 函式的所有實例(其可為空性很重要)轉換為改用 `maybeOf` 形式。

遷移前的程式碼

dart
ScrollController? controller = Scrollable.of(context);

遷移後的程式碼

dart
ScrollController? controller = Scrollable.maybeOf(context);

然後,對於程式碼呼叫 `of` API 後面接著驚嘆號的實例,只需移除驚嘆號即可:它不再可能傳回可為空的值。

遷移前的程式碼

dart
ScrollController controller = Scrollable.of(context)!;

遷移後的程式碼

dart
ScrollController controller = Scrollable.of(context);

以下內容也可能會有所幫助

時間軸

#

穩定發行版本:3.7

參考資料

#

API 文件

相關 PR