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

问题描述 投票:0回答:4

我已将 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,
      );
    }
  }
flutter flutter-layout flutter-dependencies flutter-test
4个回答
19
投票

在 Navigator.push 之前添加一个条件

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


10
投票

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

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

解决方案

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

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

6
投票

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

if (context.mounted) {
   Navigator.pop(context);
}


0
投票

if(context.mounted)Navigator.push( 语境, 页面转换( 类型:PageTransitionType.rightToLeft, 子:const ResetEmailScreen()));

© www.soinside.com 2019 - 2024. All rights reserved.