【问题标题】:How to pull snapshot key & values into list through Map<>?如何通过 Map<> 将快照键和值拉入列表?
【发布时间】:2022-02-08 09:54:59
【问题描述】:

我一直在关注使用实时数据库的官方 Firebase 教程:https://www.youtube.com/watch?v=sXBJZD0fBa4

我能够从 firebase 实时数据库中提取所有数据。但是,执行此操作的以下方法提供了数据列表,不引用父键 (snapshot.key)。一个理想的场景是在 Item 类 (item.key) 中有一个 key 属性,这样我就可以直接从列表中调用它。

class DatabaseModel {

  final itemsRef = FirebaseDatabase.instance.ref().child('/Contents');

  Stream<List<Items>> getItemssStream() {

    final itemsStream = itemsRef.onValue;

    final streamToPublish = itemsStream.map((event) {

      final itemsMap = Map<String, dynamic>.from(event.snapshot.value as Map<String, dynamic>);

      final itemsList = itemsMap.entries.map((element) {
        return Items.fromRTDB(Map<String, dynamic>.from(element.value));
      }).toList();

      return itemsList;    

    });

    return streamToPublish;
  }
  
}
class Items{
  final String item;
  final String expiryDate;
  final String quantity;
  final String user;

  Items({required this.item, required this.expiryDate, required this.quantity, required this.user});

  //Mapping from real-time database
  factory Items.fromRTDB(Map<String, dynamic> data) {
    return Items(
      item: data['item'],
      expiryDate: data['exp'],
      quantity: data['qty'],
      user: data['user'],
    );
  }
  
}

【问题讨论】:

    标签: firebase flutter firebase-realtime-database


    【解决方案1】:

    在此代码中,您只使用结果中每个节点的element.value

    return Items.fromRTDB(Map<String, dynamic>.from(element.value));
    

    如果您还想获取每个项目的密钥,您还必须在其中使用 element.key 并将其传递给您的 Items 对象。


    类似这样的:

    Items.fromRTDB(element.key, Map<String, dynamic>.from(element.value));
    
    ...
    
    class Items{
      final String key;
      final String item;
      final String expiryDate;
      final String quantity;
      final String user;
    
      Items({required this.key, required this.item, required this.expiryDate, required this.quantity, required this.user});
    
      //Mapping from real-time database
      factory Items.fromRTDB(String key, Map<String, dynamic> data) {
        return Items(
          key: key,
          item: data['item'],
          expiryDate: data['exp'],
          quantity: data['qty'],
          user: data['user'],
        );
      }
    }
    

    【讨论】:

    • 非常感谢弗兰克!对于未来的读者,这是有效的实现:return Items.fromRTDB((element.key), Map&lt;String, dynamic&gt;.from(element.value));
    • 糟糕,很好地抓住了element.key 在呼叫站点的错误位置。 ?我也在答案中修复了它。如果以后再次出现此类错误,您可以单击编辑链接自行修复。大多数回答者都喜欢这样的修复,因为它们是纯粹的改进。
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2015-11-02
    • 2019-02-02
    • 2018-04-18
    • 2016-11-02
    • 2014-01-27
    相关资源
    最近更新 更多