Flutter Cloud Firestore 离线时如何写入子集合

Flutter Cloud Firestore how to write to subcollection when offline

是否可以在用户离线时写入 Cloud Firestore NEW 文档 subcollection

在我的应用程序中,用户将添加一个新文档,其中的项目被添加到文档的子集合中。设备在线时一切正常。但是当离线时,第一级集合文档似乎按预期添加,但是直到设备重新在线时才添加子集合项目。

我知道 Firestore 默认启用离线持久性,如果设备失去连接,它会将文档写入缓存。但是它只能将文档写入第一级集合吗? 由于持久性功能不适用于 async/await 函数,我能否在不等待新文档写入服务器(即使用缓存引用)的情况下添加到子集合?

下面是我写入 Cloud Firestore 的示例代码。在重新联机之前我无法获取子集合 - 来自 get() 的数据将 return 为空。

谁能帮我解决这个问题?很抱歉,如果这个问题在某个地方得到了回答 - 我找不到它。

void main() async {
  
  await Firebase.initializeApp();

  FirebaseFirestore _firestore;
  _firestore = FirebaseFirestore.instance;

  runApp(
    MultiProvider(
      providers: [
        Provider<MyFirestoreFunctions>(create: (_) => MyFirestoreFunctions(_firestore)),
      ],
      child: MyApp(),
    ),
  );
}

class MyFirestoreFunctions {
  MyFirestoreFunctions(this._firestore) : assert(_firestore != null);

  final FirebaseFirestore _firestore;

   Future<DocumentReference> addNewDocument(DocClass doc, ItemClass item,) {
    Future<DocumentReference> result = _firestore
        .collection('Documents')
        .add(doc.toJson())
        .collection(‘Items’) // I cannot do this without await and cannot use await while offline.
        .add(item.toJson());

    return result;
  }
}

我想我是在 的帮助下解决的。显然,我做错了……我更改了代码以首先生成一个新的 DocumentReference 并从地图设置它的值。这样我就不必等待 return 的 Future,并且可以将文档的引用添加到其子集合中。现在一切都按预期工作。这是对示例代码的重写:

Future<void> addNewDocument(
      {@required DocClass doc,
      @required ItemClass item}) {
        
    final DocumentReference docRef = _firestore.collection(‘Documents’).doc();

    doc.id = docRef.id;

   _firestore.collection(‘Documents’).doc(doc.id).set(doc.toJson());
      
    final DocumentReference itemRef = docRef.collection('Items').doc();

    item.id = itemRef.id;       

    docRef
        .collection(‘Items’)
        .doc(item.id)
        .set(item.toJson());        
      
}