Flutter弹窗菜单(PopupMenu)添加登出功能后无法正确登出用户问题求助
问题根因
你遇到的问题是由三个错误共同导致的:
- 异步方法未等待执行完成:
confirmSignOut是返回Future的异步方法,你当前代码调用时没有加await,调用后立刻执行跳转逻辑,此时登出操作还未执行完毕,落地页检测到用户仍处于登录状态就会跳回首页。 - 跳转逻辑重复冗余:
Auth类的_signOut方法内部已经实现了登出完成后跳转落地页的逻辑,你在弹窗菜单的选中回调里又写了一次跳转,会造成逻辑冲突。 - Auth实例使用不规范:你在回调中直接创建了新的
Auth()实例,没有使用全局通过Provider注入的AuthBase实例,不符合你封装的依赖注入规范。
修复方案
第一步:修改弹窗菜单的登出逻辑
修改BrandPopUpMenu的onSelected回调,将登出分支的代码替换为以下内容:
onSelected: (value) async { // 给回调加async关键字支持await switch (value) { // 其他分支的代码保持不变 case PopUpMenuText.logout: // 从Provider获取全局Auth实例,不要新建实例 final auth = Provider.of<AuthBase>(context, listen: false); // 等待登出流程完全执行完成 await auth.confirmSignOut(context); break; } },
第二步(可选):统一路由过渡动画
如果你想要落地页跳转也使用你自定义的FadeScale过渡效果,可以修改Auth类_signOut方法中的跳转代码,将原来的MaterialPageRoute替换为你的自定义路由:
Navigator.pushAndRemoveUntil<dynamic>( context, FadeScaleRoute( widget: const LandingPage(), ), (route) => false, );
修改完成后,登出流程会先弹出确认弹窗,用户确认后会等待Firebase登出操作完全执行完毕,再跳转至落地页,此时用户状态已经更新为未登录,不会再跳回首页。
内容的提问来源于stack exchange,提问作者Carleton Y
相关产品推荐
相关产品推荐

