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
相关产品推荐
相关产品推荐

