將 `of` 遷移至不可為空的傳回值,並新增 `maybeOf`
摘要
#本遷移指南說明如何轉換使用各種靜態 `of` 函式從上下文中檢索資訊的程式碼,這些函式過去會傳回可為空的值,但現在會傳回不可為空的值。
背景
#Flutter 有一種常見的模式,允許使用通常稱為 `of` 的靜態成員函式來查找某些類型的 Widget(通常是 InheritedWidget
,但也包括其他 Widget)。
當不可為空成為預設值時,最常用的 API 傳回不可為空的值就變得理想。這是因為在呼叫 `Scrollable.of(context)` 之後,仍然需要 `!` 運算符或 `?` 以及回退值會讓人覺得很尷尬,而且不符合不可為空的 Dart 程式碼的慣用寫法。
當我們在先前的遷移中消除了 `nullOk` 參數時,就執行了許多這方面的遷移,但該遷移遺漏了一些 `of` 方法,並且後續添加的一些方法具有可為空的傳回型別,這與我們的常見模式背道而馳。
在此遷移中,受影響的 `of` 存取器分為兩個呼叫:一個傳回不可為空的值,並且在找不到所需值時會擲回例外(仍然稱為 `of`),另一個傳回可為空的值,並且不會擲回例外,如果找不到值則會傳回 null(一個名為 `maybeOf` 的新方法)。
變更說明
#此變更將這些靜態 `of` API 修改為傳回不可為空的值。如果找不到值,它們現在也會在偵錯模式中斷言,並在發佈模式中擲回例外。
AutofillGroup.of
DefaultTabController.of
DefaultTextHeightBehavior.of
Form.of
HeroControllerScope.of
Material.of
Overlay.of
PageStorage.of
PrimaryScrollController.of
RenderAbstractViewport.of
RestorationScope.of
Scrollable.of
ScrollNotificationObserver.of
此變更還在上述函式旁邊引入了新的靜態 `maybeOf` API,這些 API 會傳回相同值的可為空版本,並且如果找不到值,則只會傳回 null,而不會擲回任何例外。
AutofillGroup.maybeOf
DefaultTabController.maybeOf
DefaultTextHeightBehavior.maybeOf
Form.maybeOf
HeroControllerScope.maybeOf
Material.maybeOf
Overlay.maybeOf
PageStorage.maybeOf
PrimaryScrollController.maybeOf
RenderAbstractViewport.maybeOf
RestorationScope.maybeOf
Scrollable.maybeOf
ScrollNotificationObserver.maybeOf
遷移指南
#若要修改您的程式碼以使用新的 API 形式,請先將原始靜態 `of` 函式的所有實例(其可為空性很重要)轉換為改用 `maybeOf` 形式。
遷移前的程式碼
ScrollController? controller = Scrollable.of(context);
遷移後的程式碼
ScrollController? controller = Scrollable.maybeOf(context);
然後,對於程式碼呼叫 `of` API 後面接著驚嘆號的實例,只需移除驚嘆號即可:它不再可能傳回可為空的值。
遷移前的程式碼
ScrollController controller = Scrollable.of(context)!;
遷移後的程式碼
ScrollController controller = Scrollable.of(context);
以下內容也可能會有所幫助
unnecessary_non_null_assertion
(linter 訊息) 會識別應該移除 `!` 運算符的位置unnecessary_null_checks
(分析選項) 會識別不需要 `?` 運算符的位置unnecessary_null_in_if_null_operators
會識別不需要 `??` 運算符的位置unnecessary_nullable_for_final_variable_declarations
(分析選項) 會找到final
和const
變數上不必要的問號運算符
時間軸
#穩定發行版本:3.7
參考資料
#API 文件
相關 PR
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面上次更新於 2024-04-04。 檢視原始碼 或 回報問題。