从Firebase检索实时数据

时间:2019-11-17 13:17:08

标签: firebase firebase-realtime-database flutter dart

我设置了一个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();
                              });
                            });
                          },
                        )
                      ],
                    ),
                  ),
                );
              }
            }));

2 个答案:

答案 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 objecton...流属性之一。与您当前代码最接近的是onValue流。

来自FlutterFire example app的示例:

_counterRef.onValue.listen((Event event) {
  setState(() {
    _error = null;
    _counter = event.snapshot.value ?? 0;
  });
}

因此,您看到它也使用了@satish's answer解释的setState(...)