【问题标题】:Using Document Reference Type with Flutter, Provider and Firestore在 Flutter、Provider 和 Firestore 中使用文档引用类型
【发布时间】:2021-11-09 03:54:16
【问题描述】:

我正在使用ProviderFirestore 来获取一些在其数据模型中使用Document Reference Type 的文档

有没有一种好方法可以在同一个“小部件构建”通道中同时获取数据和嵌套引用?

我可以检索数据,并且可以从数据中构建我的类和小部件,但在检索到引用的文档后我无法更新小部件。

相关对象的数据模型如下所示:

{
    name: "Check name",
    modifiers: [1, 2 ,3],
    stats: [stat_reference_one, stat_reference_two]
}

其中stat_reference_one 是路径和引用类型。它的路径是:"/users/.../.../checks/:id"

在我的数据服务中,我有以下代码:

class DataService {
  final FirebaseFirestore _db = FirebaseFirestore.instance;

  Stream<List<Check>> getChecks() {
    var ref = _db.collection(
        "/users/.../.../checks/");

    return ref.snapshots().map((list) => list.docs.map((doc) {
          Map _a = doc.data() as Map<dynamic, dynamic>;

          var _alternatives = _a['rollAlternatives']['default'];

          List _s = _alternatives['stats'];

          List<Stat> SS = [];
          _s.forEach((e) => getStat(e.parent.path, e.id).listen((Stat event) {
                SS.add(event);
              }));

          return Check.fromFirestore(doc, statList: SS);
        }).toList());


  Stream<Stat> getStat(String parentPath, String docId) {
    return _db
    .collection(parentPath)
    .doc(docId)
    .get()
    .asStream()
    .map((doc) => Stat.fromFirestore(doc));
  }

你可以看到我有两个建设者一个Stat.fromFirestore和一个Check.fromFirestore

class Stat {

  ...

  Stat(this.name, this.value);

  ...

  factory Stat.fromFirestore(DocumentSnapshot doc) {
    Map data = doc.data() as Map<dynamic, dynamic>;
    return Stat(
      data['name'],
      data['value'],
    );
  }
}

因此,getChecks 方法在尝试创建新的 Check 对象实例之前消耗了 getStatStat。但目前它创建了Check 对象,Stat 的流尚未完成。因此,我的小部件仅使用 modifiers 字段中的常量值绘制。直到我更改屏幕,我才看到使用 stats 字段的结果呈现的小部件,所以它可以工作,但它没有“按时”呈现

有什么好的方法可以解决这个问题吗?我可以将getStat 变成未来,但我无法获得流式传输的数据,这是我需要的。

也许有一种方法可以等待流解决然后返回getChecks的结果我尝试使用listen的onDone参数,但它的类型签名为void。

提前谢谢你

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore flutter-provider


    【解决方案1】:

    当处理更多相互嵌套的流时,使用 RxDart 之类的包是明智的。这将简化和平滑您的程序。 https://pub.dev/packages/rxdart

    您一定要检查一下,根据您的解释,switchLatest 函数会为您完成这项工作。 https://pub.dev/documentation/rxdart/latest/rx/Rx/switchLatest.html

    如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2018-08-19
      • 1970-01-01
      • 2021-04-18
      • 2019-09-17
      相关资源
      最近更新 更多