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

Firestore查询空文档引发数组越界,性别判断逻辑报错

问题:Firebase集合查询引发数组越界错误

问题描述

尝试通过Firebase的两个集合(contatore、contatoreD)根据uid获取用户性别,在UI中根据性别显示不同组件,但出现错误:当uid为男性时,women变量报错;当uid为女性时,man变量报错。

相关代码

genere() async {

   QuerySnapshot querySnap = await FirebaseFirestore.instance.collection('contatore').where('Sesso', isEqualTo: 'Uomo').where('uid', isEqualTo: FirebaseAuth.instance.currentUser!.uid).get();
   var man = querySnap.docs[0]['Sesso'] == 'Uomo';
   var prenotato = querySnap.docs[0]['Prenotato'] == true;

//Donna
   var querySnapD = await FirebaseFirestore.instance.collection('contatoreD').where('Sesso', isEqualTo: 'Donna').where('uid', isEqualTo: FirebaseAuth.instance.currentUser!.uid).get();
   var women = querySnapD.docs[0]['Sesso'] == 'Donna';
   var prenotatoD = querySnapD.docs[0]['Prenotato'] == true;

   if(man && prenotato) {
     setState(() {
     isUomo = true;
     isPren = true;
   });
   }
   if(women && prenotatoD) {
       setState(() {
         isDonna = true;
         isPrenD = true;
       });
     }
 }

问题核心

无论用户性别如何,代码都会查询两个集合,当对应性别集合中无用户文档时,查询结果为空,直接访问docs[0]会引发数组越界错误。

解决方案

方案1:先检查查询结果是否为空再访问文档

在访问docs[0]之前,先判断docs是否不为空,避免数组越界:

genere() async {
  final currentUid = FirebaseAuth.instance.currentUser!.uid;

  // 查询男性集合
  QuerySnapshot querySnap = await FirebaseFirestore.instance
      .collection('contatore')
      .where('Sesso', isEqualTo: 'Uomo')
      .where('uid', isEqualTo: currentUid)
      .get();
  
  if (querySnap.docs.isNotEmpty) {
    var man = querySnap.docs[0]['Sesso'] == 'Uomo';
    var prenotato = querySnap.docs[0]['Prenotato'] == true;
    if (man && prenotato) {
      setState(() {
        isUomo = true;
        isPren = true;
      });
    }
  }

  // 查询女性集合
  QuerySnapshot querySnapD = await FirebaseFirestore.instance
      .collection('contatoreD')
      .where('Sesso', isEqualTo: 'Donna')
      .where('uid', isEqualTo: currentUid)
      .get();
  
  if (querySnapD.docs.isNotEmpty) {
    var women = querySnapD.docs[0]['Sesso'] == 'Donna';
    var prenotatoD = querySnapD.docs[0]['Prenotato'] == true;
    if (women && prenotatoD) {
      setState(() {
        isDonna = true;
        isPrenD = true;
      });
    }
  }
}

方案2:合并集合优化查询(推荐)

将两个性别拆分的集合合并为一个集合(比如命名为users),用Sesso字段区分性别。这样只需一次查询,既高效又避免了分别查询两个集合的问题:

genere() async {
  final currentUid = FirebaseAuth.instance.currentUser!.uid;

  QuerySnapshot querySnap = await FirebaseFirestore.instance
      .collection('users')
      .where('uid', isEqualTo: currentUid)
      .get();
  
  if (querySnap.docs.isNotEmpty) {
    final userDoc = querySnap.docs[0];
    final sesso = userDoc['Sesso'];
    final prenotato = userDoc['Prenotato'] == true;

    setState(() {
      if (sesso == 'Uomo') {
        isUomo = true;
        isPren = true;
      } else if (sesso == 'Donna') {
        isDonna = true;
        isPrenD = true;
      }
    });
  }
}

内容的提问来源于stack exchange,提问作者Francesco Ferri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:27:02