Firestore:如何监听尚不存在的文档的更改?

时间:2021-05-11 07:27:17

标签: flutter google-cloud-firestore

我有两个应用程序可以访问同一个 Firestore 数据库。 “用户”应用程序侦听对集合中文档的更改,该集合在“管理员”应用程序创建之前不存在。代码如下:

        Stream<DocumentSnapshot>logStream = FirebaseFirestore.instance
            .collection('companies')
            .doc(companyId)
            .collection('log')
            .doc(DateFormat('yyyy-MM-dd').format(DateTime.now()))
            .snapshots();
      }

问题是我无法开始收听“logStream”,除非它存在。

有没有办法检查它何时创建然后开始收听?

1 个答案:

答案 0 :(得分:0)

您无法在创建文档后立即开始收听流,这不是 Firestore 本身支持的。因此,为了做到这一点,您将创建一个偶尔调用的函数来检查它,直到它被创建,这个函数将创建一个 import I18n from 'i18n-js'; import tr from './tr'; import en from './en'; import ar from './ar'; I18n.fallbacks = true; I18n.locale = 'tr'; I18n.translations = { tr, en, ar, }; const $t = (key, params = {}) => { return I18n.t(key, params ); }; const changeEnglish = () => { I18n.locale = 'en'; }; export {$t, I18n, changeEnglish}; ,检查文档是否存在,如果积极开始收听

您可以使用 get(),如评论中所述,在此之前侦听“空”流而不触发任何操作,但仍需要调用以检查前面提到的文档是否存在,因此您的代码可以如下所示:

StreamCompleter

如果在文档存在之前您无法继续执行应用程序,您可以创建一个持续调用 var db = FirebaseFirestore.instance; var completer = StreamCompleter<DocumentSnapshot>(); Stream<DocumentSnapshot>logStream = completer.stream(); // this function will need to be called sporadically checkDocumentExists(completer); checkDocumentExists(completer){ var reference = db.collection('companies') .doc(companyId) .collection('log') .doc(DateFormat('yyyy-MM-dd').format(DateTime.now())); reference.get() => then(function(document) { if(document.exists){ completer.setSourceStream(reference.snapshots()); } } } 直到流准备好。