错误信息:
Don't use 'BuildContext's across async gaps. (Documentation) Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check.
为了处理“不建议在异步操作中使用 BuildContext
”的警告,您需要确保在异步操作完成后,BuildContext
仍然有效。可以使用 mounted
属性来检查 BuildContext
是否有效,mounted
属性在 StatefulWidget
中可用,表示当前小部件是否仍然在小部件树中。
修改后的代码示例
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('提示'),
content: Text('是否确认操作?'),
actions: [
TextButton(
onPressed: () {
// 关闭弹框
Navigator.of(context).pop();
// 等待3秒后检查小部件是否仍然存在
Future.delayed(Duration(seconds: 3), () {
if (context.mounted) {
Navigator.of(context).pop(); // 返回上一个页面
}
});
},
child: Text('确认'),
),
TextButton(
onPressed: () {
Navigator.of(context).pop(); // 只是关闭弹框
},
child: Text('取消'),
),
],
);
},
);
说明:
-
context.mounted
: 这个检查确保在延迟操作后,BuildContext
仍然有效。如果小部件已经被销毁(例如,用户导航到了其他页面),Navigator
调用不会发生,从而避免使用无效的BuildContext
。 - 这个方法避免了在异步操作完成后直接使用
BuildContext
,而不检查其有效性。
请确保这段代码放在一个 StatefulWidget
中,因为 mounted
属性在 StatefulWidget
中可用。如果您使用的是 StatelessWidget
,需要将其转换为 StatefulWidget
以访问 mounted
属性。