You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>类型的变量,存在严重的类型不匹配,即便修复调用语法也会先触发类型转换报错。
解决方案
  1. 先修正数据解析逻辑,将返回的Map结构手动转换为List<UsersData>
  2. 直接通过点语法调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:27:03