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