【问题标题】:How to retrieve data in Firebase Real-time Database如何在 Firebase 实时数据库中检索数据
【发布时间】:2021-08-20 23:32:39
【问题描述】:

我正在制作一个应用程序来保存和显示患者的癫痫发作历史。由于我是 Flutter 的新手,因此在从日历中选择日期时如何从当前用户的 firebase 检索数据时遇到困难。

我将数据存储在实时数据库中,为此,我将日期用作孩子,如果发生超过 1 次癫痫发作,那么它将使用新密钥将数据存储在同一日期下.我想获取该日期的数据,因为它存储在 firebase 中,如下所示:

我正在使用此代码获取所选日期的数据。默认情况下,日历上选择的日期是当前日期。由于此代码正确地从数据库中获取数据,但如果日期在 firebase 中没有数据,则不会显示其他条件。

更新代码:

初始化状态:

  @override
  void initState() {
    var dateTime = DateTime.now();
    _date = "${dateTime.day}-${dateTime.month}-${dateTime.year}";
    //call the load method
    loadData();

    setState(() {
      _controller = CalendarController();
    });
  }

加载数据:

 loadData() {
    list.clear();
    print(_date);
    //load the data from firebase and add to the list
    fb.reference()
      ..child(cuser.uid)
          .child('Seizure_history')
          .child(_date)
          .once()
          .then((DataSnapshot snapshot) {
        var data = snapshot.value;
        data.forEach((key, value) {
          EventList seizure_history = new EventList(
            seiz_duration: value['duration'],
            dateTime: value['datetime'],
            key: key,
          );
          list.add(seizure_history);
        });
        setState(() {
          print("History Present");
        });
      });

  }

日历:

onDaySelected: (date, events, _) {
                    //print(TimeOfDay.fromDateTime(date));
                    print(date);
                    print(_focusedDay);
                    var datesel = "${date.day}-${date.month}-${date.year}";
                    //set the date
                    setState(() {
                      _date = datesel.toString();
                      //call the method again
                      loadData();
                    });

                  },

无论我选择哪个日期,它都会在每个日期为我提供相同的癫痫发作历史记录,我认为问题出在我的日期,但我无法弄清楚如何将其设为全局以便在从日历中选择时更改它

这是它在每个日期显示的内容:

由于 DB 只有 2-6-2021 的数据,但它在每个日期都显示相同的数据。但是,如果日期在 Firebase DB 中没有数据,它应该显示这个:(下图是 UI 设计)

【问题讨论】:

    标签: firebase flutter dart firebase-realtime-database


    【解决方案1】:

    您正在将数据加载到 initState 中,因此它被加载并仅监听该子节点一次。最好创建一个方法来加载数据并在每次日期更改时调用它。

    loadData(){
      //first clear the list once you dont need the other result
      list.clear();
      
      //load the data from firebase and add to the list
      //i think you could use once(), cause you dont need you listen every date
      fb.reference()
          ..child(cuser.uid).child('Seizure_history').child(_date).once();
    
     //then you add the result to the cleared list remember call setstate to reload the ui
    }
    

    然后在 initState 方法上设置初始数据并调用 load 方法:

      @override
      void initState() {
        var dateTime = DateTime.now();
        //use the global variable instead of creating a local one
        _date = "${dateTime.day}-${dateTime.month}-${dateTime.year}";
        
       //call the load method
       loadData();
      }
    

    然后在更改日历上的日期时设置新的日期并再次调用 load 方法。

    onDaySelected: (date, events, _) {
       //print(TimeOfDay.fromDateTime(date));
       print(date);
       print(_focusedDay);
       var datesel = "${date.day}-${date.month}-${date.year}";
       
       //set the date
       _date = datesel.toString();
       //call the method again
       loadData();
    },
    

    我只放了部分代码,希望你能实现。

    【讨论】:

    • 我会相应地更改我的代码,并将反馈给您
    • “调用 setstate 重新加载 ui”是什么意思?
    • 当您将元素放在列表中时,您需要将状态重新加载到屏幕重建并显示对列表的更改,就像您在添加的初始状态打印历史记录中所做的那样。明白了吗?
    • 是的,我明白了,但我仍然不确定在设置状态下重新加载 UI,我以前从未这样做过。
    • 当您调用 set state 时,小部件会重新加载以显示新状态。因此,每次调用 set state 时都会调用 build 方法并重建所有小部件。
    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 2018-09-11
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2019-04-16
    • 2020-12-09
    相关资源
    最近更新 更多