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