use_build_context_synchronously
不要在非同步間隙中使用 'BuildContext',即使透過不相關的 'mounted' 檢查來保護。
不要在非同步間隙中使用 'BuildContext'。
描述
#當 StatefulWidget 在非同步間隙後引用 BuildContext 但沒有先檢查 mounted 屬性時,分析器會產生此診斷。
儲存 BuildContext 以供後續使用可能導致難以診斷的崩潰。非同步間隙隱式儲存 BuildContext,使其容易在診斷時被忽略。
示例
#以下程式碼會產生此診斷,因為 context 在 await 之後被傳遞給建構函式
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();
}
}
}