目录

use_build_context_synchronously

不要在异步间隔中使用 BuildContext

此规则从 Dart 2.13 开始可用。

规则集: flutter

详细信息

#

不要在异步间隔中使用 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