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数据路径与键名匹配
- 登录Firebase控制台,确认实时数据库中
Sensor节点的字段键名与模型fromJson方法中使用的键完全一致(包括大小写),比如Baterai、Pakan是否和数据库中的键名完全相同,避免因大小写或拼写错误导致解析失败。 - 在监听回调中添加打印语句,查看获取到的原始数据:
确认是否成功获取到数据库中的真实数据。_databaseReference.onValue.listen((event) { print("原始数据: ${event.snapshot.value}"); // 现有代码 });
- 登录Firebase控制台,确认实时数据库中
检查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
相关产品推荐
相关产品推荐

