我已将 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,
);
}
}
在 Navigator.push 之前添加一个条件
if (mounted)
。您正在异步方法中使用上下文。当执行此方法时,上下文可能会发生变化。但这个上下文正在被传递给导航器。因此我认为错误..
在方法中存储 BuildContext 会导致异步间隙,如果应用程序崩溃,稍后可能会导致难以找到问题。
因此,当从 StatefulWidget 使用 BuildContext 时,必须在异步间隙后检查已安装的属性。
解决方案
使用“if (!mounted) return;”在使用上下文之前。
if (!mounted) return;
Navigator.push(
context,
PageTransition(
type: PageTransitionType.rightToLeft,
child: const ResetEmailScreen()));
找到避免“不要跨异步间隙使用 BuildContexts”的最佳解决方案:
if (context.mounted) {
Navigator.pop(context);
}
if(context.mounted)Navigator.push( 语境, 页面转换( 类型:PageTransitionType.rightToLeft, 子:const ResetEmailScreen()));