Как получить идентификатор документа сразу после добавления документа в Firestore в флаттере Dart - PullRequest
0 голосов
/ 26 марта 2020

У меня есть этот код:

RaisedButton(
    child: Text('Add'),
    onPressed: () async {
        if (_formKey.currentState.validate()) {
            DocumentReference docRef =
                await DatabaseServices().addUserProperty(
                    user.userUid,
                    _currentPropertyName,
                    _currentPropertyNotes,
                    _currentPropertyZone,
                    _currentPropertyAddress `enter code here`,
                    _currentPropertyLandArea,
                    _currentPropertyDatePurchased,
                    _currentPropertyRatesBillingCode,
                    _currentPropertyInsurancePolicy,
                    _currentPropertyInsuranceSource,
                    _currentPropertyInsuranceExpiryDate `enter code here`,
                    _currentPropertyLegalDescription,
                    _currentPropertyValuation,
                    _currentPropertyValuationSource,
                    false,
                    Timestamp.now(),
                    Timestamp.now(),
                );
            await DatabaseServices().addPropertyUnit(
                user.userUid,
                docRef.documentID,
                'Single unit',
                '',
                '',
                0,
                false,
                false,
                Timestamp.now(),
                Timestamp.now(),
            );
            Navigator.pop(context);
        }
    })

, где я пытаюсь использовать 'docRef.documentID' из только что созданного documentId для addUserProperty. Я хочу сохранить это как поле в addPropertyUnit. Я получаю сообщение об ошибке «Получатель« documentID »был вызван на ноль» в строке docRef.documentID. Что мне делать?

Спасибо за предложение ralemos. Я поместил второе ожидание et c внутри .then (). Теперь у меня есть этот код:

RaisedButton(
                child: Text('Add'),
                onPressed: () async {
                  if (_formKey.currentState.validate()) {
                    DocumentReference docRef = await DatabaseServices()
                        .addUserProperty(
                      user.userUid,
                      _currentPropertyName,
                      _currentPropertyNotes,
                      _currentPropertyZone,
                      _currentPropertyAddress,
                      _currentPropertyLandArea,
                      _currentPropertyDatePurchased,
                      _currentPropertyRatesBillingCode,
                      _currentPropertyInsurancePolicy,
                      _currentPropertyInsuranceSource,
                      _currentPropertyInsuranceExpiryDate,
                      _currentPropertyLegalDescription,
                      _currentPropertyValuation,
                      _currentPropertyValuationSource,
                      false,
                      Timestamp.now(),
                      Timestamp.now(),
                    )
                        .then((docRef) async {
                      await DatabaseServices().addPropertyUnit(
                        user.userUid,
                        'nnnnnnnnnn',
//                        docRef.documentID,
                        'Single unit',
                        '',
                        '',
                        0,
                        false,
                        false,
                        Timestamp.now(),
                        Timestamp.now(),
                      );
                      return null;
                    });
//                    print('docRef: ${docRef.documentID}');

                    Navigator.pop(context);
                  }
                })  

, который работает в том, что он сохраняет новый PropertyUnit, но как мне передать docRef.documentID из .addUserProperty в .addPropertyUnit ()? В настоящее время он просто сохраняет 'nnnnnnnnnnn'. Если я определю 'DocumentReference docRef;' чуть ниже 'Widget build (BuildContext context) {', docRef.documentID доступен в .addPropertyUnit, но все еще получает ошибку времени выполнения 'Getter' documentID 'был вызван для null'.

Код для addPropertyUnit is:

// add a unit to a property
  Future addPropertyUnit(
    String userUid,
    String unitPropertyUid,
    String unitName,
    String unitNotes,
    String unitLeaseDescription,
    num unitArea,
    bool unitResidential,
    bool unitArchived,
    Timestamp unitRecordCreatedDateTime,
    Timestamp unitRecordLastEdited,
  ) async {
    return await userUnitCollection.document().setData(
      {
        'userUid': userUid,
        'propertyUid': unitPropertyUid,
        'unitName': unitName,
        'unitNotes': unitNotes,
        'unitLeaseDescription': unitLeaseDescription,
        'unitArea': unitArea,
        'unitResidential': unitResidential,
        'unitArchived': unitArchived,
        'unitRecordCreatedDateTime': unitRecordCreatedDateTime,
        'unitRecordLastEdited': unitRecordLastEdited,
      },
    );
  }

И addUserProperty:

 // add a property
  Future addUserProperty(
    String userUid,
    String propertyName,
    String propertyNotes,
    String propertyZone,
    String propertyAddress,
    double propertyLandArea,
    DateTime propertyDatePurchased,
    String propertyRatesBillingCode,
    String propertyInsurancePolicy,
    String propertyInsuranceSource,
    DateTime propertyInsuranceExpiryDate,
    String propertyLegalDescription,
    double propertyValuation,
    String propertyValuationSource,
    bool propertyArchived,
    Timestamp propertyRecordCreatedDateTime,
    Timestamp propertyRecordLastEdited,
  ) async {
    return await userPropertyCollection.document().setData(
      {
        'userUid': userUid,
        'propertyName': propertyName,
        'propertyNotes': propertyNotes,
        'propertyZone': propertyZone,
        'propertyAddress': propertyAddress,
        'propertyLandArea': propertyLandArea,
        'propertyDatePurchased': propertyDatePurchased,
        'propertyRatesBillingCode': propertyRatesBillingCode,
        'propertyInsurancePolicy': propertyInsurancePolicy,
        'propertyInsuranceSource': propertyInsuranceSource,
        'propertyInsuranceDate': propertyInsuranceExpiryDate,
        'propertyLegalDescription': propertyLegalDescription,
        'propertyMarketValuation': propertyValuation,
        'propertyMarketValuationSource': propertyValuationSource,
        'propertyArchived': propertyArchived,
        'propertyRecordCreatedDateTime': propertyRecordCreatedDateTime,
        'propertyRecordLastEdited': propertyRecordLastEdited,
      },
    );
  }

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Используйте код ниже. Я считаю, что это может работать.

RaisedButton(
            child: Text('Add'),
            onPressed: () async {
              if (_formKey.currentState.validate()) {
                DocumentReference docRef = await DatabaseServices()
                    .addUserProperty(
                  user.userUid,
                  _currentPropertyName,
                  _currentPropertyNotes,
                  _currentPropertyZone,
                  _currentPropertyAddress,
                  _currentPropertyLandArea,
                  _currentPropertyDatePurchased,
                  _currentPropertyRatesBillingCode,
                  _currentPropertyInsurancePolicy,
                  _currentPropertyInsuranceSource,
                  _currentPropertyInsuranceExpiryDate,
                  _currentPropertyLegalDescription,
                  _currentPropertyValuation,
                  _currentPropertyValuationSource,
                  false,
                  Timestamp.now(),
                  Timestamp.now(),
                );
                  await DatabaseServices().addPropertyUnit(
                    user.userUid,
                    docRef.documentID,
                    'Single unit',
                    '',
                    '',
                    0,
                    false,
                    false,
                    Timestamp.now(),
                    Timestamp.now());
               print('docRef: ${docRef.documentID}');

                Navigator.pop(context);
              }
            })  

Разница между нашим кодом заключается в том, что этот код ждет, пока addUserProperty () завершит работу с * fini sh, чтобы сначала получить объект docRef, а затем, когда docRef больше не равен нулю, Он запускает функцию addPropertyUnit (), поэтому docRef не будет иметь значение null.

Обновленный ответ:

Используйте приведенный ниже код для addUserProperty:

    // add a property
  Future< DocumentReference> addUserProperty( //the return type has changed to DocumentReference
    String userUid,
    String propertyName,
    String propertyNotes,
    String propertyZone,
    String propertyAddress,
    double propertyLandArea,
    DateTime propertyDatePurchased,
    String propertyRatesBillingCode,
    String propertyInsurancePolicy,
    String propertyInsuranceSource,
    DateTime propertyInsuranceExpiryDate,
    String propertyLegalDescription,
    double propertyValuation,
    String propertyValuationSource,
    bool propertyArchived,
    Timestamp propertyRecordCreatedDateTime,
    Timestamp propertyRecordLastEdited,
  ) async {
    DocumentReference document = userPropertyCollection.document(); //new document is created here

     await document.setData( // document data is set here.
      {
        'userUid': userUid,
        'propertyName': propertyName,
        'propertyNotes': propertyNotes,
        'propertyZone': propertyZone,
        'propertyAddress': propertyAddress,
        'propertyLandArea': propertyLandArea,
        'propertyDatePurchased': propertyDatePurchased,
        'propertyRatesBillingCode': propertyRatesBillingCode,
        'propertyInsurancePolicy': propertyInsurancePolicy,
        'propertyInsuranceSource': propertyInsuranceSource,
        'propertyInsuranceDate': propertyInsuranceExpiryDate,
        'propertyLegalDescription': propertyLegalDescription,
        'propertyMarketValuation': propertyValuation,
        'propertyMarketValuationSource': propertyValuationSource,
        'propertyArchived': propertyArchived,
        'propertyRecordCreatedDateTime': propertyRecordCreatedDateTime,
        'propertyRecordLastEdited': propertyRecordLastEdited,
      },
    );
return document; // returns the document after setting the data finishes so in this way, your docRef must not be null anymore.
  }
0 голосов
/ 30 марта 2020

Возможно, рассмотрите возможность получения уникального идентификатора документа, который будет использоваться Firestore для публикации данных, ДО публикации данных. Затем у вас будет идентификатор, который вы можете использовать как для addUserProperty, так и для addPropertyUnit.

Пример кода для генерации этого уникального идентификатора:

DocumentReference ref = db.collection("my_collection").doc();
String myId = ref.id;

Я использую эту технику в Firebase RTDB, и она работает хорошо, но я не так хорошо знаком с Firestore, поэтому не могу опубликовать ваш обновленный код.

Пожалуйста, смотрите этот пост для получения дополнительной информации: Firestore - возможно ли получить идентификатор, прежде чем он был добавлен?

0 голосов
/ 29 марта 2020

Попробуй это! Обязательно сделаю эту работу за вас.

RaisedButton(
   child: Text('Add'),
   onPressed: () async {
     if (_formKey.currentState.validate()) {
         DocumentReference docRef = await DatabaseServices().addUserProperty(
            user.userUid,
            _currentPropertyName,
            _currentPropertyNotes,
            _currentPropertyZone,
            _currentPropertyAddress,
            _currentPropertyLandArea,
            _currentPropertyDatePurchased,
            _currentPropertyRatesBillingCode,
            _currentPropertyInsurancePolicy,
            _currentPropertyInsuranceSource,
            _currentPropertyInsuranceExpiryDate,
            _currentPropertyLegalDescription,
            _currentPropertyValuation,
            _currentPropertyValuationSource,
            false,
            Timestamp.now(),
            Timestamp.now(),
         ).then((docRef) async {

           print('addUserProperty Done');
           // docRef.documentID available here
           print('docRef: ${docRef.documentID}'); 

           await DatabaseServices().addPropertyUnit(
              user.userUid,
              docRef.documentID,
              'Single unit',
              '',
              '',
              0,
              false,
              false,
              Timestamp.now(),
              Timestamp.now(),
           ).then(() async {
             print('addPropertyUnit Done'); 
           });
         });

       Navigator.pop(context);
     }
})  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...