无法听从实时数据库(RTDB)传入的数据

时间:2020-03-29 10:50:29

标签: firebase flutter firebase-realtime-database

这是我的实时数据库的结构。

enter image description here

在Flutter(ios)中,我尝试使用以下代码创建参考:

final tempRef = FirebaseDatabase.instance.reference().child("temp_hum");

然后我遵循通用协议,使用下面的代码侦听数据库中的更改,并且我无法通过事件_onIncomingEvent中的print语句正常工作

class _TemperatureProgressState extends State<TemperatureProgress> {
  List<Temperature> tempList;
  StreamSubscription<Event> _onTempSubscription;

 _onIncomingTemp(Event event) {
    print('event: ' +  event.snapshot.toString());
 }
   @override
  void initState() {
    super.initState();
    tempList = new List();
    _onTempSubscription = tempRef.onChildAdded.listen(_onIncomingTemp);
    print('sup');
  }
}

有什么想法吗?我在想以下之一是错误: -我的代码可能是错误的 -我没有使用child('temp_hum')正确创建我的Firebase参考 -我什至可能没有连接到正确的数据库?

更新1: -我发现我指向GoogleService-Info.splist文件中错误的数据库URL。虽然仍然无法获取传入数据

更新2: -现在,我可以通过听.then()来获取数据了。但是,我只获得一次数据,有没有办法继续监听?

tempRef.once().then((DataSnapshot snapshot){
   print('data: ${snapshot.value}');
});

1 个答案:

答案 0 :(得分:1)

找到解决方案,代码将在下面。就像弗兰克在评论中说的那样,Once()仅会查询一次,因此它将用于从get请求中检索数据。我的要求是不断聆听数据。 limitToLast(1)只是一条额外的信息,它将接收最新的数据,而不是接收您正在“侦听”的任何集合到Firebase的实时数据库中的所有内容。


    tempRef.limitToLast(1).onValue.listen((Event event) {
       Map data = event.snapshot.value;
          data.forEach((index, data) => {
             print('weight data: ${data}'),
             setState((){
               weightList.add(new Weight(data['avg_weight'], data['hive_weight'], data['object_id'], data['time'], data['user_id']));
          })
       });
    });