You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:09:03