Flutter Firebase查询:检查两个字段非空及报错解决
解决Firestore查询start_Date和due_Date非空的报错问题
错误原因
你写的第二行查询myQueryResult.where('due_Date'.length, isEqualTo : 16)存在问题:'due_Date'.length是计算字符串"due_Date"的长度(结果是整数8),但Firestore的where方法第一个参数必须是字段名字符串或FieldPath对象,传入整数就触发了断言错误。
正确写法
根据你的需求(确保两个字段非空,且due_Date值长度为16),分两种场景处理:
场景1:允许额外存储长度字段(推荐)
Firestore不支持直接查询字符串值的长度,所以可以在存储数据时,额外保存due_Date_length字段记录日期字符串的长度,之后直接查询该字段:
// 存储数据时同步保存长度 await FirebaseFirestore.instance.collection('你的集合名').doc('文档ID').set({ 'start_Date': '2024-01-01 00:00', 'due_Date': '2024-12-31 23:59', 'due_Date_length': '2024-12-31 23:59'.length, // 其他字段 }); // 查询逻辑 Query myQueryResult = FirebaseFirestore.instance.collection('你的集合名'); // 过滤start_Date非空字符串 myQueryResult = myQueryResult.where('start_Date', isNotEqualTo: ''); // 过滤due_Date非空字符串且长度为16 myQueryResult = myQueryResult.where('due_Date', isNotEqualTo: ''); myQueryResult = myQueryResult.where('due_Date_length', isEqualTo: 16);
场景2:不想额外存字段,客户端过滤
如果不想修改存储逻辑,可以先查询出两个字段非空的文档,再在客户端过滤due_Date的长度:
// 先查询非空的文档 QuerySnapshot snapshot = await FirebaseFirestore.instance.collection('你的集合名') .where('start_Date', isNotEqualTo: '') .where('due_Date', isNotEqualTo: '') .get(); // 客户端筛选due_Date长度为16的文档 List<DocumentSnapshot> filteredDocs = snapshot.docs.where((doc) { String dueDate = doc.get('due_Date'); return dueDate.length == 16; }).toList();
补充:确保字段存在且非空
如果要同时确保字段存在且不是空字符串(避免字段不存在导致后续解析错误),可以结合isNotNull和isNotEqualTo:
Query myQueryResult = FirebaseFirestore.instance.collection('你的集合名'); // start_Date存在且非空 myQueryResult = myQueryResult.where('start_Date', isNotNull: true); myQueryResult = myQueryResult.where('start_Date', isNotEqualTo: ''); // due_Date存在且非空 myQueryResult = myQueryResult.where('due_Date', isNotNull: true); myQueryResult = myQueryResult.where('due_Date', isNotEqualTo: '');
内容的提问来源于stack exchange,提问作者Laurent Thomas
相关产品推荐
相关产品推荐

