Dart调用Firebase报错:The getter '(' isn't defined for UsersData 如何解决
错误原因
- 调用语法错误:你在遍历用户数据时使用了
Item.Item("phone")的写法,你自定义的UsersData类中没有定义名为Item的方法,也没有支持括号调用的 getter 属性,Dart 解析时会将Item(后的(识别为未定义的 getter,直接触发该报错。 - 数据转换逻辑错误:Firebase Realtime Database 返回的
snapshot.val()是Map<dynamic, dynamic>类型(对应users节点下以用户ID为Key、用户详情为Value的存储结构),你直接将其赋值给List<UsersData>类型的变量,存在严重的类型不匹配,即便修复调用语法也会先触发类型转换报错。
解决方案
- 先修正数据解析逻辑,将返回的Map结构手动转换为
List<UsersData> - 直接通过点语法调用
UsersData的phone属性获取值,不需要额外加方法调用
修正后的业务代码如下:
void _getPhoneNos(BuildContext context) async { fb.Database db = fb.database(); fb.DatabaseReference<ReferenceJsImpl> dataRef = db.ref('users'); dataRef.onValue.listen((event) { fb.DataSnapshot snapshot = event.snapshot; // 修正空判断逻辑,优先判断快照是否有数据 if (!snapshot.exists) { print("Result is Empty"); return; } // 先转换为Map类型,再遍历生成UsersData列表 Map<dynamic, dynamic> rawUsers = snapshot.val() as Map; List<UsersData> usersInfo = []; rawUsers.forEach((userId, userData) { usersInfo.add(UsersData.fromJson(userId, userData)); }); usersInfo.forEach((userItem) { // 直接通过点语法获取phone属性,此处如果需要拼接多个手机号可以改为 += 操作 _singleTextFieldcontroller.text = userItem.phone; }); });
你自定义的UsersData类无需修改即可适配上述逻辑。
内容的提问来源于stack exchange,提问作者Artisans Express
相关产品推荐
相关产品推荐

