Kotlin读取Firebase实时数据库时ValueEventListener报无构造函数错误
解决方案
报错根因
你遇到的是Kotlin匿名实现的语法错误:ValueEventListener本身是接口,不存在构造函数,你在声明匿名实现时写的object: ValueEventListener()多了一对括号,相当于主动调用不存在的构造方法,因此IDE抛出This class does not have a constructor报错。
这个语法差异很容易被从Java转Kotlin的开发者忽略:Java里声明匿名内部类时,不管是实现接口还是继承类,都统一在类型后加(),但Kotlin做了严格区分:
- 继承有构造函数的普通类/抽象类时,需要在类型后加
()传入构造参数 - 实现无构造方法的接口时,不能在类型后加括号
修复代码
只需要删掉ValueEventListener后面的括号即可,修正后的监听器代码如下:
// Read from the database myRef.addValueEventListener(object: ValueEventListener { // 移除了ValueEventListener后的() override fun onDataChange(snapshot: DataSnapshot) { // This method is called once with the initial value and again // whenever data at this location is updated. val value = snapshot.getValue<String>() Log.d("onDataChange", "Value is: " + value) } override fun onCancelled(error: DatabaseError) { Log.w("onCancelled", "Failed to read value.", error.toException()) } })
额外提醒
你当前的取值逻辑仅在ChargePoint节点存储的是纯字符串值时能正常运行,如果该节点下存储的是结构化的充电桩对象列表/键值对,需要自定义对应字段的数据类,调用snapshot.getValue(你的数据类::class.java)做反序列化,否则会出现类型转换错误、拿到null值的问题。
另外确认模块级build.gradle中已经引入了和项目其他Firebase组件版本匹配的Realtime Database依赖,避免出现接口签名不匹配的隐性问题。
内容的提问来源于stack exchange,提问作者Marcus J S Pereira
相关产品推荐
相关产品推荐

