【问题标题】:Get document id from firebase flutter从 Firebase 颤振中获取文档 ID
【发布时间】:2019-12-31 18:11:39
【问题描述】:

我试图在将数据存储到 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);

【问题讨论】:

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


    【解决方案1】:

    我遇到了同样的问题,这是我如何处理它的一个 sn-p

    //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,
        });
    

    【讨论】:

      【解决方案2】:

      理想情况下,您应该从存储库中返回未来并在集团中等待未来。让我试着在这里给出一个完整的代码 sn-p。应该是这样的:

      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);
      

      【讨论】:

      • 未处理的异常:'Future' 类型不是'Future>' 类型的子类型
      • 嗨,John,我真的认为您应该使用 Firebase 类型 DocumentReference。仍然不知道你在使用什么可观察的字符串
      【解决方案3】:

      您使用 Observables 的原因是什么?这是火力基地吗?

      你可以适应:

      final var documentId = await _repository.addOrder(order);
      print(documentId)
      

      【讨论】:

      • 但我想documentID返回send_data_bloc
      • NoSuchMethodError (NoSuchMethodError: Class 'String' has no instance method 'call'. Receiver: "JlssLO5vO2Jqt8q4gocy" mean in this line 是什么意思? return Observable.fromFuture(val.documentID());
      • 接收者是documentID。
      • 您打印了 documentId 值吗?您可以从 send_data_bloc 方法中返回 documentId
      • 是的,我打印了 documentId。但是如何从repository返回到send_data_bloc
      【解决方案4】:

      这里

      a.then((val) {
              return Observable.fromFuture(val.documentID());
      });
      

      您在 then 函数中返回 observable,我相信这不是预期的行为。

      为了提高代码质量和可读性,您应该做的一件事就是让用户异步/等待。存储库上的函数可以这样重写:

      @override
      Observable<String> addOrder(Order order) async {
        var documentID = await endpoints.collectionEndpoint.add(order.toJson());
        return Observable.fromFuture(val.documentID());
      

      试试这个。这应该可以解决问题。

      【讨论】:

      • 如果我按照你的方法,我需要将addOrder函数声明为Future&lt;Observable&lt;String&gt;&gt; addOrder(Order order) async {。我会在 .listen. 上得到错误,即 The method 'listen' isn't defined for the class 'Future'
      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2022-10-06
      • 2020-08-04
      • 1970-01-01
      • 2021-02-16
      相关资源
      最近更新 更多