警告:不要在异步操作之间使用BuildContext

移动开发 2026-07-09

我在使用带有异步函数的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.pushScaffoldMessenger.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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章