【问题标题】:Retrieve realtime data from firebase从 Firebase 中检索实时数据
【发布时间】:2020-03-13 00:17:00
【问题描述】:

我设置了一个颤振项目来接收来自 firebase 的湿度传感器数据。我正在将数据上传到 firebase 并尝试在我的应用程序上检索它,但它只会在一段时间后检索数据。此外,在此之前该值为 null。而且,当更改时,应用程序上的数据没有变化。如何获取数据,以便它显示从我启动应用程序的那一刻起的数据,并在 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();
                              });
                            });
                          },
                        )
                      ],
                    ),
                  ),
                );
              }
            }));

【问题讨论】:

    标签: firebase firebase-realtime-database flutter dart


    【解决方案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 时,在您的小部件传递中,循环进度指示器或空容器。当它是真的在 else 中调用你的小部件。

    【讨论】:

    • 感谢您的建议。这确实解决了加载问题,尽管它会显示一段时间的错误屏幕。但这仍然没有刷新数据。我愿意接受有关实时数据刷新的任何建议。我已经编辑了上面的其余代码。
    • 您已经在使用 StreamBuilder,并且当您更改任何内容以使其自动更新小部件时,
    • 但不知何故没有。所以我使用 onValue(listen) 事件来监听变化并从变化中更新我的值。它奏效了。为了克服应用程序和 firebase 数据库之间的延迟,我使用了 5 秒的延迟来发送传感器数据,它就像一个魅力。我忘了处理流订阅,但这也得到了处理。感谢您的支持和建议。
    • 嗨,你还在苦苦挣扎吗? @ZeroLive
    • 我设法让它工作,但我愿意接受建议。现在我正在使用查询对象 onValue 来检查事件更改,将更改存储在 setstate 中的变量上,并使用该变量在文本字段上显示数据。
    【解决方案2】:

    要同时侦听当前值和更新,您需要观察query objecton... 流属性之一。最接近您当前代码的是onValue 流。

    来自FlutterFire example app的例子:

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

    所以你看到这也使用了@satish's answer 解释的setState(...)

    【讨论】:

    • 非常感谢您的咨询。我确实设法通过以下示例使其工作。干杯。
    • 很抱歉,我没有足够的声誉来做出明显的改变。我确实接受了答案。感谢您的时间和建议。我赶上了最后期限,并设法在最后一个小时让它工作。
    • 要接受我的回答,您必须单击复选标记。不过,这可能需要一些时间才能启用。
    猜你喜欢
    • 2019-04-16
    • 2020-12-09
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2018-09-11
    • 2019-02-04
    • 2019-05-30
    • 2019-11-28
    相关资源
    最近更新 更多