我试图在将数据存储到Firebase数据库后获取新创建的文档ID,但会出错
E/flutter (20333): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: NoSuchMethodError: The method 'listen' was called on null.
E/flutter (20333): Receiver: null
E/flutter (20333): Tried calling: listen(Closure: (String) => void)
send_data_bloc
_repository
.addOrder(order)
.listen((documentId) => print(documentId));
存储库
@override
Observable<String> addOrder(Order order) {
var a = endpoints.collectionEndpoint.add(order.toJson());
a.then((val) {
return Observable.fromFuture(val.documentID());
});
端点
@override
get collectionEndpoint => _firestore
.collection(collectionName)
.document(this.id)
.collection(orderCollectionName);
答案 0 :(得分:0)
这里
a.then((val) {
return Observable.fromFuture(val.documentID());
});
您将在then函数中返回可观察值,我认为这不是预期的行为。
要提高代码质量和可读性,您应该做的一件事就是仅使用户异步/等待。存储库中的函数可以这样重写:
@override
Observable<String> addOrder(Order order) async {
var documentID = await endpoints.collectionEndpoint.add(order.toJson());
return Observable.fromFuture(val.documentID());
尝试一下。这应该可以解决问题。
答案 1 :(得分:0)
为什么使用Observables是什么原因?这是火力基础吗?
您可以调整为:
final var documentId = await _repository.addOrder(order);
print(documentId)
答案 2 :(得分:0)
理想情况下,您应该从存储库返回未来,并等待整个集团的未来。让我尝试在此处提供完整的代码段。会是这样的:
send_data_bloc
final documentId = await _repository
.addOrder(order);
print(documentId);
return documentId;
存储库
@override
Future<String> addOrder(Order order) {
return endpoints.collectionEndpoint.add(order.toJson());
端点
@override
get collectionEndpoint => _firestore
.collection(collectionName)
.document(this.id)
.collection(orderCollectionName);
答案 3 :(得分:0)
我遇到了同样的问题,这是我的处理方式的片段
//notice im using add while referencing the document reference
final DocumentReference documentReference=await Firestore.instance.collection('jobs').add({
'jobid':"",
});
然后从documentReference获取您的ID
final String jobIdd=documentReference.documentID;
现在获取ID后,您可以将文档添加到Cloud Firestore
Firestore.instance.collection('jobs').document(jobIdd).setData({
'category': category,
'description': description,
'datePosted': formattedDate,
'postedby': userid,
'jobid':jobIdd,
});