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
相关产品推荐
相关产品推荐

