跳到主内容

use_build_context_synchronously

不要在异步间隙中使用 'BuildContext',即使通过不相关的 'mounted' 检查来保护。

不要在异步间隙中使用 'BuildContext'。

描述

#

StatefulWidget 在异步间隙后引用 BuildContext 但没有先检查 mounted 属性时,分析器会产生此诊断。

存储 BuildContext 以供后续使用可能导致难以诊断的崩溃。异步间隙隐式存储 BuildContext,使其容易在诊断时被忽略。

示例

#

以下代码会产生此诊断,因为 contextawait 之后被传递给构造函数

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