flutter 不要跨异步间隙使用BuildContexts,将pub yaml更新为主要版本后

qzwqbdag  于 2022-12-24  发布在  Flutter
关注(0)|答案(2)|浏览(151)

我已经把pub yaml升级到了flutter pub upgrade --major versions的主版本,它给了我很多建议,我不明白为什么会出错?有人能解释一下吗?
这是一个例子,它说Do not use BuildContexts across async gaps我应该怎么做。

_resetEmail(String password,) async {
    final user = FirebaseAuth.instance.currentUser;
    final credential =
        EmailAuthProvider.credential(email: user!.email!, password: password);
    try {
      UserCredential;
      await FirebaseAuth.instance.currentUser
          ?.reauthenticateWithCredential(credential);

       ///The problem is here
      Navigator.push(
          context,
          PageTransition(
              type: PageTransitionType.rightToLeft,
              child: const ResetEmailScreen()));
        ///

    } on FirebaseAuthException {
      Fluttertoast.showToast(
        msg: 'Wrong password',
        gravity: ToastGravity.TOP,
        toastLength: Toast.LENGTH_LONG,
        backgroundColor: Colors.grey[400],
        textColor: Colors.black,
      );
    }
  }
lf5gs5x2

lf5gs5x21#

在导航器前添加一个条件if (mounted)。你在异步方法中使用了一个上下文。当这个方法被执行时,上下文可以改变。但是这个上下文被传递给了导航器。因此我认为错误是...

w8ntj3qf

w8ntj3qf2#

将BuildContext存储在方法中会导致异步间隙,这可能会在应用崩溃时导致查找问题的困难。
因此,当从StatefulWidget使用BuildContext时,必须在异步间隙之后检查已安装属性。

    • 解决方案**

使用"如果(!已安装)返回; "然后再使用上下文。

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

相关问题