Flutter使用Firestore StreamBuilder出现Stream类型不匹配错误怎么解决?
错误原因
你调用.doc(uid)之后,获取的是单个指定文档的实时数据流,返回的是Stream<DocumentSnapshot>类型,而你声明的_usersStream和StreamBuilder都用了QuerySnapshot类型,这个类型是用于集合查询返回多个文档结果的,二者类型不匹配所以报错。
修复方案
- 第一步:修改流变量和StreamBuilder的泛型类型,从
QuerySnapshot改为DocumentSnapshot<Map<String, dynamic>> - 第二步:修改数据读取逻辑,单个文档不需要遍历
docs集合,直接从DocumentSnapshot中取数据即可
修改后的完整代码如下:
class _UserProfileScreenState extends State<UserProfileScreen> { // 修改变量类型为DocumentSnapshot对应的流 final Stream<DocumentSnapshot<Map<String, dynamic>>> _usersStream = FirebaseFirestore.instance.collection('users').doc(uid).snapshots(); @override Widget build(BuildContext context) { return StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>( // 泛型同步修改 stream: _usersStream, builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) { if (snapshot.hasError) { return const Text('Something went wrong'); } if (snapshot.connectionState == ConnectionState.waiting) { return const Text(""); } // 直接获取单条文档数据 Map<String, dynamic> data = snapshot.data!.data()!; return Scaffold( appBar: ProfileAppBar(), body: ListView( children: [ ListTile( title: Text(data['username']), subtitle: Text(data['displayName']), ) // 其他要展示的字段可以直接在这里添加对应组件 ], ), ); }, ); } }
可选优化
可以增加文档存在性判断,避免空数据异常:
if (!snapshot.data!.exists) { return const Text("该用户不存在"); } // 确认文档存在后再执行数据读取逻辑
内容的提问来源于stack exchange,提问作者DB Cooper
相关产品推荐
相关产品推荐

