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

Flutter GetX无法获取展示Firebase实时数据库Sensor数据求助

问题:Flutter中使用GetX获取Firebase实时数据库传感器数据,始终显示初始值0

我在Flutter中尝试通过GetX获取并展示Firebase实时数据库的传感器数据,但运行后始终显示初始值0,无法加载真实数据。相关代码如下:

Sensor控制器代码

final sensorData = Sensor(
  baterai: 0,
  pakan: 0,
  setAir: 0,
  setJam: 0,
  setMenit: 0,
  suhu: 0.0,
  ultrasonic: 0,
  pH: 0.0,
).obs;
late DatabaseReference _databaseReference;

@override
void onInit() {
  super.onInit();
  _databaseReference = FirebaseDatabase.instance.ref('Sensor');
  _databaseReference.onValue.listen((event) {
    var snapshot = event.snapshot;
    if (snapshot.value != null) {
      var data = snapshot.value;
      if (data != null && data is Map<String, dynamic>) {
        var sensor = Sensor.fromJson(data);
        sensorData.value = sensor;
      } else {
        sensorData.value = Sensor(
          baterai: 0,
          pakan: 0,
          setAir: 0,
          setJam: 0,
          setMenit: 0,
          suhu: 0.0,
          ultrasonic: 0,
          pH: 0.0,
        );
      }
    }
  });
}

Sensor模型代码

int baterai;
int pakan;
int setAir;
int setJam;
int setMenit;
double suhu;
int ultrasonic;
double pH;

Sensor({
  required this.baterai,
  required this.pakan,
  required this.setAir,
  required this.setJam,
  required this.setMenit,
  required this.suhu,
  required this.ultrasonic,
  required this.pH,
});

factory Sensor.fromJson(Map<String, dynamic> json) => Sensor(
      baterai: json["Baterai"],
      pakan: json["Pakan"],
      setAir: json["Set_Air"],
      setJam: json["Set_Jam"],
      setMenit: json["Set_Menit"],
      suhu: json["Suhu"]?.toDouble(),
      ultrasonic: json["Ultrasonic"],
      pH: json["pH"]?.toDouble(),
    );

Map<String, dynamic> toJson() => {
      "Baterai": baterai,
      "Pakan": pakan,
      "Set_Air": setAir,
      "Set_Jam": setJam,
      "Set_Menit": setMenit,
      "Suhu": suhu,
      "Ultrasonic": ultrasonic,
      "pH": pH,
    };

页面展示代码

Obx(() => Text('Pakan ${sensorController.sensorData.value.pakan}',
                style: TextStyle(fontSize: 18.0),
              ), 

解决方案

以下是针对该问题的排查和修复步骤:

  • 验证Firebase数据路径与键名匹配

    1. 登录Firebase控制台,确认实时数据库中Sensor节点的字段键名与模型fromJson方法中使用的键完全一致(包括大小写),比如Baterai、Pakan是否和数据库中的键名完全相同,避免因大小写或拼写错误导致解析失败。
    2. 在监听回调中添加打印语句,查看获取到的原始数据:
      _databaseReference.onValue.listen((event) {
        print("原始数据: ${event.snapshot.value}");
        // 现有代码
      });
      
      确认是否成功获取到数据库中的真实数据。
  • 检查Firebase数据库权限规则
    默认的实时数据库规则仅允许认证用户访问,如果未实现用户登录,会导致读取失败。可以临时设置测试规则(测试完成后务必改回安全规则):

    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    
  • 确保GetX控制器正确初始化
    页面中必须通过Get.put(SensorController())或Get.find<SensorController>()获取控制器实例,避免重新创建未绑定监听的新实例,导致数据无法更新。

  • 处理模型解析中的空值问题
    若数据库中存在null字段,直接赋值会导致解析失败,需为字段添加默认值:

    factory Sensor.fromJson(Map<String, dynamic> json) => Sensor(
          baterai: json["Baterai"] ?? 0,
          pakan: json["Pakan"] ?? 0,
          setAir: json["Set_Air"] ?? 0,
          setJam: json["Set_Jam"] ?? 0,
          setMenit: json["Set_Menit"] ?? 0,
          suhu: (json["Suhu"] ?? 0).toDouble(),
          ultrasonic: json["Ultrasonic"] ?? 0,
          pH: (json["pH"] ?? 0.0).toDouble(),
        );
    
  • 捕获监听异常
    在监听中添加错误回调,排查连接或权限问题:

    _databaseReference.onValue.listen((event) {
      // 现有代码
    }, onError: (error) {
      print("Firebase监听错误: $error");
    });
    

内容的提问来源于stack exchange,提问作者Breed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:48