移除 nullOk 引數
概述
#本遷移指南描述瞭如何將使用多個 of 靜態訪問器及相關訪問器上的 nullOk 引數的程式碼,轉換為使用具有可空返回值的備用 API。
背景
#Flutter 中有一種常見的模式,即允許使用靜態成員函式(通常稱為 of)來查詢某些型別的 widget(InheritedWidget),這些函式需要一個 BuildContext。
在非空性成為預設設定之前,這些 API 上有一個開關很有用,可以在 widget 不存在於 widget 樹中時丟擲異常,或者在未找到 widget 時返回 null。這很有用,而且不令人困惑,因為當時每個變數都是可空的。
當非空性成為預設設定後,就希望最常用的 API 返回一個非空值。這是因為呼叫 MediaQuery.of(context, nullOk: false),然後在此呼叫後仍然需要一個 ! 運算子或 ? 和一個回退值,感覺很不方便。
nullOk 引數是一種廉價的提供空安全切換方式,但在真正的語言支援非空性的大環境下,它卻向開發者提供了冗餘甚至可能矛盾的訊號。
為了解決這個問題,of 訪問器(以及一些也使用 nullOk 的相關訪問器)被拆分成了兩個呼叫:一個返回非空值,並在找不到所需 widget 時丟擲異常;另一個返回可空值,不丟擲異常,並在找不到 widget 時返回 null。
此變更的設計文件是 移除 nullOk 引數。
變更說明
#實際的變更修改了這些 API,使其不再具有 nullOk 引數,並返回非空值
MediaQuery.ofNavigator.ofScaffoldMessenger.ofScaffold.ofRouter.ofLocalizations.localeOfFocusTraversalOrder.ofFocusTraversalGroup.ofFocus.ofShortcuts.ofActions.handlerActions.findActions.invokeAnimatedList.ofSliverAnimatedList.ofCupertinoDynamicColor.resolveCupertinoDynamicColor.resolveFromCupertinoUserInterfaceLevel.ofCupertinoTheme.brightnessOfCupertinoThemeData.resolveFromNoDefaultCupertinoThemeData.resolveFromCupertinoTextThemeData.resolveFromMaterialBasedCupertinoThemeData.resolveFrom
並在此基礎上引入了以下新 API,用於返回可空值
MediaQuery.maybeOfNavigator.maybeOfScaffoldMessenger.maybeOfScaffold.maybeOfRouter.maybeOfLocalizations.maybeLocaleOfFocusTraversalOrder.maybeOfFocusTraversalGroup.maybeOfFocus.maybeOfShortcuts.maybeOfActions.maybeFindActions.maybeInvokeAnimatedList.maybeOfSliverAnimatedList.maybeOfCupertinoDynamicColor.maybeResolveCupertinoUserInterfaceLevel.maybeOfCupertinoTheme.maybeBrightnessOf
遷移指南
#為了修改程式碼以使用新形式的 API,請將所有包含 nullOk = true 作為引數的 API 呼叫,轉換為使用 API 的 maybe 版本。
所以,這個
MediaQueryData? data = MediaQuery.of(context, nullOk: true);變成了
MediaQueryData? data = MediaQuery.maybeOf(context);您還需要修改所有使用 nullOk = false(通常是預設值)呼叫 API 的例項,以接受非空返回值,或移除任何 ! 運算子
所以,以下兩者之一
MediaQueryData data = MediaQuery.of(context)!; // nullOk false by default.
MediaQueryData? data = MediaQuery.of(context); // nullOk false by default.兩者都變成了
MediaQueryData data = MediaQuery.of(context); // No ! or ? operator here now.unnecessary_non_null_assertion 分析選項可以幫助您查詢應刪除 ! 運算子的位置,而 unnecessary_nullable_for_final_variable_declarations 分析選項可以幫助您查詢 final 和 const 變數上不必要的問號運算子。
時間線
#已釋出版本:1.24.0
穩定版本:2.0.0
參考資料
#API 文件
MediaQuery.ofNavigator.ofScaffoldMessenger.ofScaffold.ofRouter.ofLocalizations.localeOfFocusTraversalOrder.ofFocusTraversalGroup.ofFocus.ofShortcuts.ofActions.handlerActions.findActions.invokeAnimatedList.ofSliverAnimatedList.ofCupertinoDynamicColor.resolveCupertinoDynamicColor.resolveFromCupertinoUserInterfaceLevel.ofCupertinoTheme.brightnessOfCupertinoThemeData.resolveFromNoDefaultCupertinoThemeData.resolveFromCupertinoTextThemeData.resolveFromMaterialBasedCupertinoThemeData.resolveFromMediaQuery.maybeOfNavigator.maybeOfScaffoldMessenger.maybeOfScaffold.maybeOfRouter.maybeOfLocalizations.maybeLocaleOfFocusTraversalOrder.maybeOfFocusTraversalGroup.maybeOfFocus.maybeOfShortcuts.maybeOfActions.maybeFindActions.maybeInvokeAnimatedList.maybeOfSliverAnimatedList.maybeOfCupertinoDynamicColor.maybeResolveCupertinoUserInterfaceLevel.maybeOfCupertinoTheme.maybeBrightnessOf
相關議題
相關 PR
- 移除
MediaQuery.of中的nullOk - 移除
Navigator.of中的nullOk - 從
AnimatedList.of和SliverAnimatedList.of中移除nullOk引數 - 從
Shortcuts.of、Actions.find和Actions.handler中移除nullOk引數 - 從
Focus.of、FocusTraversalOrder.of和FocusTraversalGroup.of中移除nullOk引數 - 從
Localizations.localeOf中移除nullOk引數 - 從
Router.of中移除nullOk引數 - 從
Scaffold.of和ScaffoldMessenger.of中移除nullOk - 從 Cupertino 顏色解析 API 中移除
nullOk引數 - 從
Localizations.localeOf中移除遺留的nullOk引數 - 從
Actions.invoke中移除nullOk,並新增Actions.maybeInvoke