这是我的实时数据库的结构。
在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}');
});
答案 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']));
})
});
});