Flutter开发WhatsApp克隆:状态展示出现Firebase数据获取RangeError
问题原因与修复方案
错误根源
报错RangeError (index): Invalid value: Valid value range is empty: 0是因为代码直接访问了联系人的phones[0],但部分联系人可能未存储电话号码,导致phones列表为空,访问索引0时触发数组越界错误。
修复后的完整代码
Future<List> getStatus(BuildContext context) async { List statusData = []; try { List<Contact> contacts = []; if (await FlutterContacts.requestPermission()) { contacts = await FlutterContacts.getContacts(withProperties: true); } for (int i = 0; i < contacts.length; i++) { // 跳过无电话号码的联系人,避免空列表索引越界 if (contacts[i].phones.isEmpty) continue; var statusesSnapshot = await firestore .collection('status') .where( 'phoneNumber', isEqualTo: contacts[i].phones[0].number.replaceAll( ' ', '', ), ) .where( 'createdAt', isGreaterThan: DateTime.now() .subtract(const Duration(hours: 24)) .microsecondsSinceEpoch, ) .get(); for (var tempData in statusesSnapshot.docs) { Status tempStatus = Status.fromMap(tempData.data()); if (tempStatus.whoCanSee.contains(auth.currentUser!.uid)) { statusData.add(tempStatus); } } } } catch (e) { if (kDebugMode) print(e); showSnackBar(context: context, content: e.toString()); } return statusData; }
核心修复说明
- 新增
if (contacts[i].phones.isEmpty) continue;判断,直接跳过没有电话号码的联系人,从根源避免空列表索引访问错误。 - 若业务需要处理多号码联系人,可在此基础上扩展逻辑(比如遍历所有号码查询状态),但跳过空号码联系人是最直接的修复方式。
内容的提问来源于stack exchange,提问作者safad tm
相关产品推荐
相关产品推荐

