跳至主要內容

use_build_context_synchronously

穩定版本
Flutter

請勿在非同步間隙中使用 BuildContext

詳細資訊

#

請「勿」在非同步間隙中使用 BuildContext

儲存 BuildContext 以供稍後使用,很容易導致難以診斷的崩潰。非同步間隙會隱式儲存 BuildContext,而且在編寫程式碼時最容易被忽略。

當使用 BuildContext 時,必須在非同步間隙後檢查 mounted 屬性,具體取決於 BuildContext 的存取方式

  • 當使用 Statecontext 屬性時,必須檢查 Statemounted 屬性。
  • 對於其他 BuildContext 實例(例如區域變數或函式引數),必須檢查 BuildContextmounted 屬性。

不良範例

dart
void onButtonTapped(BuildContext context) async {
  await Future.delayed(const Duration(seconds: 1));
  Navigator.of(context).pop();
}

良好範例

dart
void onButtonTapped(BuildContext context) {
  Navigator.of(context).pop();
}

良好範例

dart
void onButtonTapped(BuildContext context) async {
  await Future.delayed(const Duration(seconds: 1));

  if (!context.mounted) return;
  Navigator.of(context).pop();
}

良好範例

dart
abstract class MyState extends State<MyWidget> {
  void foo() async {
    await Future.delayed(const Duration(seconds: 1));
    if (!mounted) return; // Checks `this.mounted`, not `context.mounted`.
    Navigator.of(context).pop();
  }
}

啟用

#

若要啟用 use_build_context_synchronously 規則,請在您的 analysis_options.yaml 檔案中的 linter > rules 下新增 use_build_context_synchronously

analysis_options.yaml
yaml
linter:
  rules:
    - use_build_context_synchronously

如果您改用 YAML map 語法來設定 linter 規則,請在 linter > rules 下新增 use_build_context_synchronously: true

analysis_options.yaml
yaml
linter:
  rules:
    use_build_context_synchronously: true