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

firebase_ui_auth ProfileScreen删除确认对话框无响应问题求助

问题描述

使用自定义ProfileView组件包裹firebase_ui_auth库的ProfileScreen时,开启showDeleteConfirmationDialog: true后,弹出删除确认对话框时应用完全卡死,必须热重启才能恢复,且账户删除流程未执行。

可能的解决方案

1. 检查依赖版本兼容性

确保firebase_core、firebase_auth、firebase_ui_auth三者使用最新且兼容的版本,版本不匹配常导致UI交互阻塞类问题。可以在pubspec.yaml中更新到最新稳定版:

firebase_core: ^2.15.0
firebase_auth: ^4.10.0
firebase_ui_auth: ^1.4.0

(版本号以pub.dev最新稳定版为准)

2. 正确监听用户状态,避免初始化时直接获取currentUser

原代码中在State初始化时直接获取currentUser,可能存在用户状态未就绪的情况,导致ProfileScreen内部逻辑异常。改用StreamBuilder监听用户状态变化:

class _ProfileViewState extends State<ProfileView> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return const Center(child: CircularProgressIndicator());
        }
        
        return ProfileScreen(
          appBar: AppBar(title: const Text('Profile')),
          showDeleteConfirmationDialog: true,
          actions: [
            SignedOutAction((context) {
              Navigator.of(context).pop();
            }),
            AccountDeletedAction((context, user) {
              // 使用rootNavigator确保正确退出当前页面
              Navigator.of(context, rootNavigator: true).pop();
            })
          ],
        );
      },
    );
  }
}

3. 绕过内置对话框,自定义账户删除流程

如果内置的确认对话框仍有问题,可以禁用它,手动实现删除确认和账户删除逻辑:

class _ProfileViewState extends State<ProfileView> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return const Center(child: CircularProgressIndicator());
        }

        final currentUser = snapshot.data!;
        
        return ProfileScreen(
          appBar: AppBar(title: const Text('Profile')),
          // 禁用内置对话框
          showDeleteConfirmationDialog: false,
          actions: [
            SignedOutAction((context) {
              Navigator.of(context).pop();
            }),
            // 添加自定义删除按钮
            ActionButton(
              icon: const Icon(Icons.delete_outline),
              label: const Text('删除账户'),
              onPressed: () async {
                final shouldDelete = await showDialog<bool>(
                  context: context,
                  barrierDismissible: false,
                  builder: (ctx) => AlertDialog(
                    title: const Text('确认删除'),
                    content: const Text('账户删除后无法恢复,确定继续?'),
                    actions: [
                      TextButton(
                        onPressed: () => Navigator.pop(ctx, false),
                        child: const Text('取消'),
                      ),
                      TextButton(
                        style: TextButton.styleFrom(foregroundColor: Colors.red),
                        onPressed: () => Navigator.pop(ctx, true),
                        child: const Text('删除'),
                      ),
                    ],
                  ),
                );

                if (shouldDelete == true) {
                  try {
                    await currentUser.delete();
                    Navigator.of(context).pop();
                  } catch (e) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('删除失败:${e.toString()}')),
                    );
                  }
                }
              },
            ),
          ],
        );
      },
    );
  }
}

4. 检查全局UI拦截逻辑

排查项目中是否存在全局的Overlay、加载遮罩或路由监听逻辑,这些可能会阻塞对话框的交互事件,导致应用卡死。


内容的提问来源于stack exchange,提问作者Naing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:48:11