警告:不要在异步操作之间使用BuildContext
我在使用带有异步函数的BuildContext时遇到了一个警告。
void login(BuildContext context) async {
bool success = await controller.login(_passwordController.text);
if (success) {
Navigator.push(
context,
MaterialPageRoute(builder: (_) => const HomeScreen()),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Aktivacijski kod nije validan")),
);
}
}
下面是警告:
不要在异步间隙中使用 'BuildContext'。
尝试改写代码,让其不使用 'BuildContext',或者在使用前加上一个 'mounted' 的检查来保护。
解决方案
警告之所以会出现,是因为await controller.login(...) 会创建一个异步间隙。在这段时间里,拥有这个 BuildContext 的小部件可能会从小部件树中被移除(例如,用户返回上一页或关闭屏幕)。当await完成后,你仍然在对 Navigator.push 和 ScaffoldMessenger.of(context) 使用context,但如果该小部件已经被销毁,该context就不再有效,可能导致崩溃,因此linter会警告你。
在一个 StatefulWidget 中,你可以通过在异步调用结束后、在使用context之前检查mounted来修复这个问题:
void login() async {
final success = await controller.login(_passwordController.text);
if (!mounted) return;
if (success) {
Navigator.push(
context,
MaterialPageRoute(builder: (_) => const HomeScreen()),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("hello flutter")),
);
}
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。