跳到主要内容

use_build_context_synchronously

稳定
Flutter

不要在异步间隙中使用 BuildContext

详情

#

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

如果你正在使用 YAML map 语法配置 linter 规则,则在 linter > rules 下添加 use_build_context_synchronously: true

analysis_options.yaml
yaml
linter:
  rules:
    use_build_context_synchronously: true