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