跳到主內容

use_build_context_synchronously

不要在非同步間隙中使用 'BuildContext',即使透過不相關的 'mounted' 檢查來保護。

不要在非同步間隙中使用 'BuildContext'。

描述

#

StatefulWidget 在非同步間隙後引用 BuildContext 但沒有先檢查 mounted 屬性時,分析器會產生此診斷。

儲存 BuildContext 以供後續使用可能導致難以診斷的崩潰。非同步間隙隱式儲存 BuildContext,使其容易在診斷時被忽略。

示例

#

以下程式碼會產生此診斷,因為 contextawait 之後被傳遞給建構函式

dart
import 'package:flutter/material.dart';

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

常見修復方法

#

如果可以消除非同步間隙,請這樣做

dart
import 'package:flutter/material.dart';

class MyWidget extends Widget {
  void onButtonTapped(BuildContext context) {
    Navigator.of(context).pop();
  }
}

如果無法消除非同步間隙,則使用 mounted 來保護對 context 的使用

dart
import 'package:flutter/material.dart';

class MyWidget extends Widget {
  void onButtonTapped(BuildContext context) async {
    await Future.delayed(const Duration(seconds: 1));
    if (context.mounted) {
      Navigator.of(context).pop();
    }
  }
}