use_build_context_synchronously
請勿在非同步間隙中使用 BuildContext
。
詳細資訊
#請「勿」在非同步間隙中使用 BuildContext
。
儲存 BuildContext
以供稍後使用,很容易導致難以診斷的崩潰。非同步間隙會隱式儲存 BuildContext
,而且在編寫程式碼時最容易被忽略。
當使用 BuildContext
時,必須在非同步間隙後檢查 mounted
屬性,具體取決於 BuildContext
的存取方式
- 當使用
State
的context
屬性時,必須檢查State
的mounted
屬性。 - 對於其他
BuildContext
實例(例如區域變數或函式引數),必須檢查BuildContext
的mounted
屬性。
不良範例
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
除非另有說明,否則本網站上的文件反映的是 Dart 3.7.1 版本。頁面最後更新於 2025-03-07。 檢視原始碼 或 回報問題。