Flutter firebase_database v7.1.1如何判断DataSnapshot是否为空?
问题根源
- 即使目标数据库节点不存在,
once()方法返回的DataSnapshot实例本身不会为null,仅快照的value属性会为null,所以第一个判断data == null永远不会触发。 - 第二种写法使用
!强制非空断言,当极端场景下data真为null时会直接抛出空安全异常,属于不安全的写法。 firebase_database: ^7.1.1属于较早版本,官方还未在DataSnapshot中实现exists()、hasData()这类封装好的判断方法,只能通过校验value属性实现节点存在性判断。
正确实现代码
await FirebaseDatabase.instance .reference() .child('classrooms') .child(classroomId) .once() .then((DataSnapshot? data) { // 使用安全调用同时校验data和value是否为空 if(data?.value == null) { print('目标节点不存在'); return; } // 走到此处可保证data和value都非空,正常访问即可 print('节点存在,数据为:${data.value}'); });
补充说明
Firebase Realtime Database本身不允许存储null值,如果你尝试写入null到某个节点,该节点会被直接删除,所以通过data?.value == null判断节点不存在的逻辑是完全可靠的,不会出现误判。
内容的提问来源于stack exchange,提问作者MBK
相关产品推荐
相关产品推荐

