Kotlin中的Firebase SDK – onChildChanged不会触发列表中的第一个子项

我正在开发一个服务器端应用程序,使用Kotlin来管理Firebase中的Web客户列表。 我已成功将Java Firebase Admin SDK添加到我的Kotlin,并与我的实时数据库建立了功能连接。

不过,我只注意到一个问题。 我添加了一个ChildEventListener来监听他们数据的变化,而且它对每个客户都很好,除了列表中的第一个外。 无论是订购数据还是订购数据,no第一个查询的项目在数据库中实际编辑时都不会收到一个ChildChanged回调。

var ref=FirebaseDatabase.getInstance().getReference("web- customers").orderByChild("displayName") ref.addChildEventListener(object:ChildEventListener{ override fun onCancelled(p0: DatabaseError?) { if(p0!=null) println(p0.message) } override fun onChildMoved(p0: DataSnapshot?, p1: String?) { println("A child moved !!!!!!!!!!!!!!!!!!") } override fun onChildChanged(p0: DataSnapshot, p1: String) { println("A child changed !!!!!!!!!!!!!!!!!!") val key=p0.key as String println("A customer changed: "+key) for(value:HashMap<String,Any> in list){ println(value.get(".key") as String+": "+value.get("displayName") as String) if((value.get(".key") as String).equals(key)){ val valor=p0.value as HashMap<String,Any> for(llave in valor.keys){ val dato=valor.get(llave) as Any value.put(llave,dato) } println("Customer "+valor.get("displayName") as String+" modified!!!!!!") refresh() break } } } override fun onChildAdded(p0: DataSnapshot, p1: String?) { println("A child added !!!!!!!!!!!!!!!!!!") val value=p0.value as HashMap<String,Any> value.put(".key",p0.key as String) list.add(value) } override fun onChildRemoved(p0: DataSnapshot?) { println("A child removed !!!!!!!!!!!!!!!!!!") } }) 

我认为客户中的数据可能会有些问题,所以它甚至没有抛出异常而崩溃,但是即使在添加一个用于检查ChildChanged回调的println被激发之后,它也不会对第一个客户产生影响列表!

我过去曾经为Java(没有Kotlin)做过类似的代码,而且他们一直都很棒。

我正在使用最新的Firebase Java SDK版本5.2.0。

有没有人遇到类似的错误?

这是因为你正在使用p1 : String而不是p1 : String? 。 字符串实际上是previousChildName ,这就是为什么你这样做。

因为Kotlin没有NullPointerException ,所以在字符串之后使用问号( ? )如下: p1: String?

希望它有帮助。

感谢@Alex Mamo发表的评论,我将注意力放在了前面的小孩姓名params上,而这个问题让我被困了好几个小时!

鉴于Kotlin的默认行为不允许非空引用变量没有“?” 最后,onChildChanged方法没有被触发,只有我的第一个项目,因为它的previousChildName实际上是null。

所以,我改变了p1: Stringp1: String? 问题解决了!

它不是这样工作的:

 override fun onChildChanged(p0: DataSnapshot, p1: String) { ... } 

它以这种方式工作!:

 override fun onChildChanged(p0: DataSnapshot, p1: String?) { ... }