將 `of` 遷移到非可空返回值,並新增 `maybeOf`
概述
#本遷移指南描述瞭如何將使用各種靜態 `of` 函式來檢索上下文資訊(以前返回可空值,現在返回非可空值)的程式碼進行轉換。
背景
#Flutter 中有一個常見的模式,允許使用靜態成員函式(通常稱為 `of`)來查詢某些型別的 widget(通常是 InheritedWidget,但也有其他型別)。
當可空性成為預設值後,就希望最常用的 API 返回非可空值。這是因為呼叫 `Scrollable.of(context)` 後仍然需要 `!` 運算子或 `?` 加上一個回退值,這感覺很彆扭,並且不符合非可空 Dart 程式碼的習慣用法。
在 之前的遷移 中,我們在消除 `nullOk` 引數時完成了大部分遷移,但其中一些 `of` 方法在此次遷移中被遺漏,還有一些隨後被添加了可空返回值型別,這與我們的通用模式相悖。
在此次遷移中,受影響的 `of` 訪問器被拆分為兩個呼叫:一個返回非可空值,並在找不到所需值時丟擲異常(仍稱為 `of`);另一個返回可空值,並且不丟擲異常,如果找不到值則返回 null(這是一個新方法,稱為 `maybeOf`)。
變更說明
#此更改修改了這些靜態 `of` API,使其返回非可空值。如果找不到值,它們現在也會在除錯模式下斷言,並在釋出模式下丟擲異常。
AutofillGroup.ofDefaultTabController.ofDefaultTextHeightBehavior.ofForm.ofHeroControllerScope.ofMaterial.ofOverlay.ofPageStorage.ofPrimaryScrollController.ofRenderAbstractViewport.ofRestorationScope.ofScrollable.ofScrollNotificationObserver.of
此更改還在上述函式旁邊引入了新的靜態 `maybeOf` API,這些 API 返回相同值的可空版本,如果找不到值,則僅返回 null,而不會丟擲任何異常。
AutofillGroup.maybeOfDefaultTabController.maybeOfDefaultTextHeightBehavior.maybeOfForm.maybeOfHeroControllerScope.maybeOfMaterial.maybeOfOverlay.maybeOfPageStorage.maybeOfPrimaryScrollController.maybeOfRenderAbstractViewport.maybeOfRestorationScope.maybeOfScrollable.maybeOfScrollNotificationObserver.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