我设置了一个Flutter项目,以接收来自Firebase的湿度传感器数据。我正在将数据上传到firebase并尝试在我的应用程序上进行检索,但过了一段时间才检索数据。此外,该值在此之前为空。而且,更改后,应用程序上的数据也不会更改。如何获取数据,以便从启动应用程序开始显示数据,并在Firebase上的数据更新时更改数据?这是我的代码。
double moistureData;
@override
bool _isLoading = false;
void initState() {
super.initState();
databaseReference.child('Data').once().then((DataSnapshot snapshot) {
int moisture = snapshot.value['Moisture'];
moistureData = moisture.toDouble();
print(moisture);
setState(() {
if (moistureData != null) {
_isLoading = true;
}
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Moisture'),
),
body: StreamBuilder(
stream: databaseReference.child('Data').child('Moisture').onValue,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
} else {
return Center(
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Text('$moistureData'),
RaisedButton(
child: Text('Refresh'),
onPressed: () {
setState(() {
databaseReference
.child('Data')
.once()
.then((DataSnapshot snapshot) {
int moisture = snapshot.value['Moisture'];
moistureData = moisture.toDouble();
});
});
},
)
],
),
),
);
}
}));
答案 0 :(得分:1)
当然,从firebase加载数据,创建一个bool变量并将其设置为false会花费一些时间。
double moistureData;
bool _isLoading=false;
@override
void initState() {
super.initState();
databaseReference.child('Data').once().then((DataSnapshot snapshot) {
final int moisture = snapshot.value['Moisture'];
moistureData=moisture.toDouble();
print(moisture);
setState((){
if(moistureData!=null)
_isLoading=true;
});
});
}
在_isLoading为false的情况下,在窗口小部件内部,循环进度指示器或空容器中。确实如此时,请在其他地方调用您的小部件。
答案 1 :(得分:0)
要侦听当前值和更新,您需要观察query object的on...
流属性之一。与您当前代码最接近的是onValue
流。
来自FlutterFire example app的示例:
_counterRef.onValue.listen((Event event) { setState(() { _error = null; _counter = event.snapshot.value ?? 0; }); }
因此,您看到它也使用了@satish's answer解释的setState(...)
。