如何在颤振中以简单的方式从实时数据库中获取数据?

Posted

技术标签:

【中文标题】如何在颤振中以简单的方式从实时数据库中获取数据?【英文标题】: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'];

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

【问题讨论】:

【参考方案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/…

以上是关于如何在颤振中以简单的方式从实时数据库中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中从实时数据库中获取空值

在颤振中显示仅产品名称的列表,使用json格式的woocommerce api数据

如何使用颤振从firebase实时检索数据

如何在firebase实时数据库中获取“序列”或类似结构的计数器

使用颤振从 Firebase 实时数据库中读取子节点的数量

颤振:如何从 json 中获取数据?