Flutter FirebaseAuth.instance.currentUser()废弃后的替代方案
问题原因
新版firebase_auth插件已经移除了异步方法currentUser(),将获取当前登录用户的逻辑拆分为两类实现:
- 同步属性
FirebaseAuth.instance.currentUser:类型为User?,可直接同步读取当前用户对象,无需异步等待,但在App冷启动、Firebase Auth尚未完成本地持久化用户信息加载时,会短暂返回null - 三个状态流用于监听用户状态变化:
authStateChanges()、userChanges()、idTokenChanges()
适配FutureBuilder的替代方案
要实现和旧版currentUser()完全一致、返回Future<User?>类型、可直接传入FutureBuilder的方法,直接取authStateChanges()流的第一个事件即可:
future: FirebaseAuth.instance.authStateChanges().first,
该方法的行为和旧版currentUser()完全对齐:
- 会等待Firebase完成初始化、加载完本地持久化的登录状态后再返回结果
- 已登录时返回
User对象,未登录时返回null - 仅返回一次结果,不会持续订阅状态变化,无额外性能开销
- 如果需要获取包含最新用户资料(如头像、昵称修改后)的用户对象,可以替换为
FirebaseAuth.instance.userChanges().first,逻辑完全一致
修改后的完整代码
补全了原代码未写完的用户ID判断逻辑,同时给FutureBuilder添加了泛型避免类型强转:
class Messages extends StatelessWidget { const Messages({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection('chat') .orderBy('createdAt', descending: true) .snapshots(), builder: (ctx, chatSnapshot) { if (chatSnapshot.connectionState == ConnectionState.waiting) { return const Center( child: CircularProgressIndicator(), ); } final chatDocs = chatSnapshot.data!.docs; return FutureBuilder<User?>( future: FirebaseAuth.instance.authStateChanges().first, builder: (ctx, futureSnapshot) { if (futureSnapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } return ListView.builder( reverse: true, itemCount: chatDocs.length, itemBuilder: (ctx, index) => MessageBubble( chatDocs[index]['text'], chatDocs[index]['userId'] == futureSnapshot.data?.uid, ), ); }); }, ); } }
内容的提问来源于stack exchange,提问作者cueless
相关产品推荐
相关产品推荐

