不要跨异步间隙使用 BuildContext。将 pub yaml 更新到主要版本后

It'*_*hil 10 flutter flutter-test flutter-dependencies flutter-layout

我已将 pub yaml 升级到主要版本flutter pub upgrade --major versions,它给了我很多建议错误我不\xe2\x80\x99t 明白为什么?。有人可以解释一下吗?

\n

这是一个例子。它说Do not use BuildContexts across async gaps我在这里应该做什么。

\n
_resetEmail(String password,) async {\n    final user = FirebaseAuth.instance.currentUser;\n    final credential =\n        EmailAuthProvider.credential(email: user!.email!, password: password);\n    try {\n      UserCredential;\n      await FirebaseAuth.instance.currentUser\n          ?.reauthenticateWithCredential(credential);\n\n       ///The problem is here\n      Navigator.push(\n          context,\n          PageTransition(\n              type: PageTransitionType.rightToLeft,\n              child: const ResetEmailScreen()));\n        ///\n\n    } on FirebaseAuthException {\n      Fluttertoast.showToast(\n        msg: 'Wrong password',\n        gravity: ToastGravity.TOP,\n        toastLength: Toast.LENGTH_LONG,\n        backgroundColor: Colors.grey[400],\n        textColor: Colors.black,\n      );\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

Kau*_*dru 19

在Navigator.push之前添加一个条件if (mounted)。您正在异步方法中使用上下文。当执行此方法时,上下文可能会发生变化。但这个上下文正在被传递给导航器。因此我认为错误..


Anm*_*ngh 10

在方法中存储 BuildContext 会导致异步间隙,如果应用程序崩溃,稍后可能会导致难以找到问题。

因此,当从 StatefulWidget 使用 BuildContext 时,必须在异步间隔后检查已安装的属性。

解决方案

使用“if (!mounted) return;” 在使用上下文之前。

if (!mounted) return;
  Navigator.push(
      context,
      PageTransition(
          type: PageTransitionType.rightToLeft,
          child: const ResetEmailScreen()));
Run Code Online (Sandbox Code Playgroud)


Ala*_*ois 6

找到避免“不要跨异步间隙使用 BuildContexts”的最佳解决方案:

对于无状态小部件:

if (context.mounted) {
   Navigator.pop(context);
}
Run Code Online (Sandbox Code Playgroud)

对于 StateFull 小部件:

if (mounted) {
   Navigator.pop(context);
}
Run Code Online (Sandbox Code Playgroud)