You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:10:30