Flutter+Firestore最新版如何仅获取当前用户数据?
Flutter + 新版Firestore 仅获取特定用户数据问题
我正尝试用Flutter结合最新版Firestore获取当前用户的专属数据,但网上旧方法因Firebase更新失效了。以下是我的StreamBuilder代码:
final currentUser = FirebaseAuth.instance.currentUser; //Streams are used to listen to realtime streams of data @override Widget build(BuildContext context) { return StreamBuilder<QuerySnapshot>( stream: _usersStream, builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasError) { return Text('Something went wrong'); } if (snapshot.connectionState == ConnectionState.waiting) { return Text("Loading"); } return ListView( children: snapshot.data!.docs.map((DocumentSnapshot document) { Map<String, dynamic> data = document.data()! as Map<String, dynamic>; return Row( children: [ Text(data['first name']), Text(data['last name']), ], ); }).toList(), ); }, ); }
我想用uid查询当前用户的全部数据,试了两种流查询都没用:
第一种写法:
final Stream<QuerySnapshot> _myUserStream = FirebaseFirestore.instance.collection('users').doc(currentUser!.uid).snapshots();
第二种写法:
final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance.collection('users').where('email', currentUser.email).snapshots();
问题原因与解决方法
错误1:流类型不匹配
doc(currentUser!.uid).snapshots()返回的是单个文档的流(Stream<DocumentSnapshot>),但你声明的变量类型是Stream<QuerySnapshot>,类型不匹配导致无法正常工作。
正确写法(推荐,直接通过文档ID获取,效率更高):
final currentUser = FirebaseAuth.instance.currentUser; // 修正流的类型为Stream<DocumentSnapshot> final Stream<DocumentSnapshot> _myUserStream = FirebaseFirestore.instance .collection('users') .doc(currentUser?.uid) .snapshots(); @override Widget build(BuildContext context) { // 同步修改StreamBuilder的泛型为DocumentSnapshot return StreamBuilder<DocumentSnapshot>( stream: _myUserStream, builder: (context, snapshot) { if (snapshot.hasError) { return const Text('出错了'); } if (snapshot.connectionState == ConnectionState.waiting) { return const Text('加载中'); } // 检查文档是否存在 if (!snapshot.hasData || !snapshot.data!.exists) { return const Text('用户数据不存在'); } // 解析单文档数据 Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>; return Row( children: [ Text(data['first name'] ?? ''), Text(data['last name'] ?? ''), ], ); }, ); }
错误2:where方法参数格式错误
新版Firestore的where方法需要明确指定比较操作符(比如isEqualTo),不能直接传值。
正确写法(适用于文档ID不是uid,而是文档内存储了uid/email字段的场景):
final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance .collection('users') // 使用isEqualTo指定匹配规则 .where('email', isEqualTo: currentUser?.email) .snapshots();
如果是通过uid字段查询,写法类似:
final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance .collection('users') .where('uid', isEqualTo: currentUser?.uid) .snapshots();
此时原有的StreamBuilder(泛型为QuerySnapshot)可以正常使用,因为where返回的是查询快照流,只是注意因为uid/email唯一,结果列表只会有一个文档。
内容的提问来源于stack exchange,提问作者Nick Plummer
相关产品推荐
相关产品推荐

