内容

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();
  }
}

用法

#

要启用同步使用 BuildContext规则,请在 analysis_options.yaml 文件中的linter > rules下添加同步使用 BuildContext

analysis_options.yaml
yaml
linter:
  rules:
    - use_build_context_synchronously