Flutter使用cloud_firestore时Stream类型不匹配报错如何解决
问题原因
- 导包冲突:项目同时引入了web端适配的
package:firebase/firebase.dart和移动端适配的package:cloud_firestore/cloud_firestore.dart,两个包都定义了QuerySnapshot类,不同来源的类型无法兼容。 - 泛型不匹配:3.0及以上版本的cloud_firestore库对
QuerySnapshot增加了泛型约束,你定义StreamBuilder时没有指定对应的泛型参数,导致类型匹配失败。
解决步骤
- 清理冗余导包:删除代码顶部的
import 'package:firebase/firebase.dart';语句,Flutter移动端开发的Firestore相关功能完全由cloud_firestore包提供,无需引入web端的firebase包。 - 补全泛型声明:给
StreamBuilder以及后续的DocumentSnapshot补全对应的泛型参数,建议优先用data()方法获取文档内容,比get()方法更易排查空值和类型问题。
修改后的完整可运行代码如下:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; class GetInfo extends StatelessWidget { const GetInfo({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Material( child: StreamBuilder<QuerySnapshot<Map<String, dynamic>>>( stream: FirebaseFirestore.instance.collection('stories').snapshots(), builder: (context, snapshot) { if (snapshot.hasError) { return const Text('Something went wrong'); } if (snapshot.connectionState == ConnectionState.waiting) { return const Text('Loading'); } return ListView( children: snapshot.data!.docs.map((DocumentSnapshot<Map<String, dynamic>> document) { Map<String, dynamic> data = document.data()!; return ListTile( title: Text(data['display_name']), subtitle: Text(data['profession']), ); }).toList(), ); }), ); } }
内容的提问来源于stack exchange,提问作者ThorstenMagic
相关产品推荐
相关产品推荐

