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());
}
是否可以在用户离线时写入 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;
}
}
我想我是在
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());
}