如何解决Flutter触发手势时抛出RangeError(index)空值范围异常
错误根因
你遇到的RangeError (index): Invalid value: Valid value range is empty: 0错误,核心触发点在chatRoomId函数:代码直接对入参字符串做了下标[0]访问,当传入的两个字符串任意一个为空时,就会触发空序列索引越界。
常见触发场景:
- Firebase Auth当前用户的
displayName未设置,实际值为空字符串 userMap['name']拿到的结果是空字符串
修复方案
方案1:更稳定的聊天室ID生成逻辑(推荐)
建议直接用用户唯一UID生成聊天室ID,既避免索引越界,也能解决displayName重复导致的ID冲突问题:
// 跳转逻辑前置校验 onTap: (){ final currentUser = _auth.currentUser; // 先校验用户信息完整性,避免空参数传入 if (currentUser == null || currentUser.uid.isEmpty || userMap?['uid'] == null || userMap!['uid'].isEmpty) { // 可自行补充用户信息异常的提示逻辑 return; } String roomId = chatRoomId(currentUser.uid, userMap!['uid']); Navigator.of(context).push( MaterialPageRoute( builder: (_) => ChatRoom( chatRoomId: roomId, userMap: userMap!, ), ) ); }, // 优化后的chatRoomId函数 String chatRoomId(String uid1, String uid2) { if (uid1.compareTo(uid2) > 0) { return "$uid2$uid1"; } else { return "$uid1$uid2"; } }
方案2:保留displayName生成逻辑的兼容修复
如果必须用displayName生成ID,需要补充空校验逻辑:
String chatRoomId(String peter, String goodone) { final a = peter.trim(); final b = goodone.trim(); // 任意字符串为空时用hashCode对比排序,避免索引访问 if (a.isEmpty || b.isEmpty) { return a.hashCode <= b.hashCode ? "$a$b" : "$b$a"; } if (b[0].toLowerCase().codeUnits[0] > a[0].toLowerCase().codeUnits[0]) { return "$b$a"; } else { return "$a$b"; } }
内容的提问来源于stack exchange,提问作者Coding-Jutsu
相关产品推荐
相关产品推荐

