Flutter中Firestore使用orderBy出现类型不匹配错误求助
解决Firestore预排序数据时的类型错误问题
你遇到的错误是因为调用orderBy()方法后,返回的对象类型是Query,而非CollectionReference,不能将Query类型的值赋值给CollectionReference类型的变量。
修复步骤:
- 修改变量类型
将_reference的类型从CollectionReference改为Query,同时直接添加orderBy排序逻辑:
Query _reference = FirebaseFirestore.instance.collection('table_name').orderBy("dlastupd");
如果需要更明确的泛型约束,可以写成:
Query<Map<String, dynamic>> _reference = FirebaseFirestore.instance.collection('table_name').orderBy("dlastupd");
- 可选:移除客户端排序代码
既然已经通过Firestore服务端完成排序,你可以删除代码里的客户端排序逻辑,减少本地计算开销:
// 移除这行客户端排序代码 // items.sort((a, b) => b["dlastupd"].compareTo(a["dlastupd"]));
- 注意:创建Firestore索引
首次运行修改后的代码时,Firestore可能会抛出需要创建索引的错误。此时控制台会提供一个直接创建索引的链接,点击链接完成索引创建即可正常运行。
修改后的完整ItemList类代码:
class ItemList extends StatelessWidget { ItemList({Key? key}) : super(key: key) { _stream = _reference.snapshots(); } Query _reference = FirebaseFirestore.instance.collection('table_name').orderBy("dlastupd"); late Stream<QuerySnapshot> _stream; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Item List'), ), body: StreamBuilder<QuerySnapshot>( stream: _stream, builder: (BuildContext context, AsyncSnapshot snapshot) { // 检查错误 if (snapshot.hasError) { return Center(child: Text('发生错误 ${snapshot.error}')); } // 检查数据是否加载完成 if (snapshot.hasData) { // 获取数据 QuerySnapshot querySnapshot = snapshot.data; List<QueryDocumentSnapshot> documents = querySnapshot.docs; // 将文档转换为Map列表 List<Map> items = documents.map((e) => { 'name': e['name'], 'dlastupd': e['dlastupd'], 'dlastupd date': DateTime.fromMillisecondsSinceEpoch(e['dlastupd'] * 1000), 'id': e.id, }).toList(); // 展示列表 return ListView.builder( itemCount: items.length, itemBuilder: (BuildContext context, int index) { // 获取当前索引的条目 Map thisItem = items[index]; // 返回列表项组件 return ListTile( title: Text(formatDate(thisItem['dlastupd date'], [dd, '', M]) + " - " + thisItem['name']), onTap: () { Navigator.pushNamed( context, '/factfile', arguments: { 'id': thisItem['id'], }, ); }, ); }); } // 加载中提示 return Center(child: CircularProgressIndicator()); }, ), ); } }
内容的提问来源于stack exchange,提问作者Nibbles
相关产品推荐
相关产品推荐

