Flutter中StreamBuilder报method '[]' called on null但变量非空问题
核心报错原因是访问数组下标[0]/[1]的对象为null,而非nextMessage本身为null,具体触发逻辑和修复方案如下:
原因分析
你提到打印nextMessage['users'][0]可以正常输出,是因为打印日志仅展示了正常数据的输出,遍历到某条异常数据时才会触发报错:
- 近期你的数据源(从
snapshot.data.snapshot.value的写法判断大概率是Firebase Realtime Database)中新增了不符合格式的消息条目:某条消息的users字段为null,或者不是长度≥2的数组 - 你未对
nextMessage['users']做非空、类型校验,直接调用下标访问,碰到users为null的异常数据时就会抛出The method '[]' was called on null的错误 - 现有代码的snapshot判断逻辑冗余,外层已经校验过无数据时返回空容器,内层不需要重复判断
snapshot.hasData和snapshot.data.snapshot.value != null,该问题不会直接触发报错。
修复方案
在访问users字段的下标前先做校验,异常数据直接跳过即可,参考修改后的代码:
StreamBuilder<dynamic>( stream: _myStream, builder: (context, snapshot) { final messageList = <BuildMessages>[]; if (!snapshot.hasData || snapshot.data.snapshot.value == null) { return Container(); } final users = Map<String, dynamic>.from(snapshot.data.snapshot.value); users.forEach((key, value) { final nextMessage = Map<String, dynamic>.from(value); // 新增users字段校验 final usersField = nextMessage['users']; if (usersField is! List || usersField.length < 2) { // 异常数据直接跳过,不处理 return; } late int index; print(usersField[0]); if (myUser.userID == usersField[0]) { index = 1; } else if (myUser.userID == usersField[1]) { index = 0; } else { // 兼容当前用户不在users数组里的异常情况 return; } // 后续原有逻辑 }); // 原有返回组件逻辑 } )
如果需要兼容users为null的情况,也可以给usersField加默认值:final usersField = nextMessage['users'] ?? [];
内容的提问来源于stack exchange,提问作者ckingprogramming
相关产品推荐
相关产品推荐

