【问题标题】:How to fetch data from realtime database in a simple way in flutter?如何在颤振中以简单的方式从实时数据库中获取数据?
【发布时间】:2021-12-29 01:41:06
【问题描述】:

目前我同时使用 Firestore 和实时数据库。我以最简单和最有效的方式在代码中设置和检索firestore,对于实时数据库,我设置了数据,但我无法像使用firestore那样检索它。 总结我想做与实时数据库代码中的firestore代码相同的事情。

这是我的代码:

//Get data from Firestore 

Stream <DocumentSnapshot> getData() async*{
    final user = FirebaseAuth.instance.currentUser; 
    yield* FirebaseFirestore.instance.collection('users').doc(user.uid).snapshots();
    }

//Return data in StreamBuilder (No lists or ListView.Builder needed here)

@override
  Widget build(BuildContext context) {

    return StreamBuilder(
      stream: getData(),
      builder: (context, snapshot) {

        //--------------------------------------
        //These equations comes from Firestore
        //--------------------------------------

        int currentWater ()=>  snapshot.data['currentLitersAmount'];

        int remainingWater () => snapshot.data['currentLitersAmount'] <= snapshot.data['recomendedLitersAmount'] ? snapshot.data['recomendedLitersAmount'] - snapshot.data['currentLitersAmount'] : 0;
        
        double progress ()=> snapshot.data['currentLitersAmount'] / snapshot.data['recomendedLitersAmount'];

那么如何在这里为实时数据库做同样的事情呢?

【问题讨论】:

    标签: flutter firebase-realtime-database google-cloud-firestore


    【解决方案1】:

    实时数据库的getData 函数相当于:

    Stream <Event> getData() async*{
        final user = FirebaseAuth.instance.currentUser; 
        yield* FirebaseDatabase.instance.reference().child('users').child(user.uid).onValue();
    }
    

    然后,您可以从 UI 构建代码中的每个 Event object 获取 DataSnapshot

    @override
    Widget build(BuildContext context) {
    
      return StreamBuilder(
        stream: getData(),
        builder: (context, snapshot) {
          int currentWater ()=>  snapshot.data.snapshot.value['currentLitersAmount'];
          ...
    

    如果 snapshot.snapshot 看起来令人困惑,请查看 What is the difference between existing types of snapshots in Firebase?

    【讨论】:

    • 实际上它在第二个快照中给了我一个准确的代码错误:这里=> snapshot.snashot.value,所以我尝试了snapshot.data.value,但它也返回了一个错误(类“事件”没有实例获取器“值”。接收方:“事件”实例尝试调用:值)
    • onValue 返回一个Event:pub.dev/documentation/firebase_database/latest/…,所以snapshot 是一个event object,你应该能够从中获取值。这就是为什么你需要snapshot.snapshot
    • 你是 100% 正确的,但这里的问题是当我编写代码时它给了我一个错误行: 1. Stream....reference('users')
    • 很遗憾,我无法在此处分享屏幕截图以向您展示正在发生的事情
    • 如果您想分享错误的屏幕截图,请编辑您的问题以包含该屏幕截图。但我想我现在明白那里出了什么问题,所以更新了我的答案中的代码。我强烈建议您将参考文档放在手边,因为如果您可以自己查找此类语法问题,速度会快很多。 pub.dev/documentation/firebase_database/latest/…
    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 2019-04-20
    • 2022-10-06
    • 2022-01-22
    • 2019-01-01
    • 2021-03-26
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多