Сохранение Flutter cloud_firestore не работает, даже если оно включено

#flutter #dart #google-cloud-firestore #persistence

#flutter #dart #google-cloud-firestore #сохранение

Вопрос:

Я провел множество поисков по этому вопросу. Но мое приложение flutter отлично работает в активной сети. Я включил сохранение для cloud_firestore, но он показывает эту ошибку:

 [cloud_firestore/unavailable] The service is currently unavailable. This is a most likely a transient condition and may be corrected by retrying with a backoff.
 

Мой пример кода:

 FirebaseFirestore db = FirebaseFirestore.instance;
  db.settings = Settings(persistenceEnabled: true, cacheSizeBytes: 10000000);

final ref = db.doc("some_collection/some_doc");

try{
  ref.update({"key": value});
} catch(error) {
  print(error.toString());
}
 

Мой pubspec.yaml :

 firebase_messaging: ^8.0.0-dev.14
firebase_core: ^0.7.0
firebase_auth: ^0.20.0 1
flutter_local_notifications: ^3.0.3
cloud_firestore: ^0.16.0
 

Комментарии:

1. используете ли вы его на мобильных устройствах или в Интернете?

2. на мобильной платформе

3. Я сталкиваюсь с точно такой же проблемой.

4. Вы инициализировали await Firebase.initializeApp()

5. @Md.AbdulHalimRafi оно включено по умолчанию. firebase.google.com/docs/firestore/manage-data/enable-offline . Обязательно инициализируйте Firebase.

Ответ №1:

Итак, мой сценарий состоял в том, что мне приходилось загружать некоторые данные в firestore всякий раз, когда мое приложение получает входящее сообщение от моего клиента. Вот почему мне понадобились две службы, одна из которых — приемник фоновых сообщений и сохранение firestore.

Что я делал:

Сначала пытаюсь прочитать некоторые данные из firestore, и на основе этого мне нужно снова поместить данные входящих сообщений в firestore. Что-то вроде этого:

 FirebaseFirestore db = FirebaseFirestore.instance;
db.settings = Settings(persistenceEnabled: true, cacheSizeBytes: 10000000);

// payments ref
final paymentRefs = db
     .collection("payments")
     .where("trxID", isEqualTo: "123456")
     .where("amount", isEqualTo: 50)
     .limit(1);

try {
   final paymentGet = await paymentRefs.get();
     if (paymentGet.size > 0) {
       final paymentData = paymentGet.docs[0];
       // check for payment existence with the trxID
       // if exists, then validate and update
       if (paymentData.exists) {
        final paymentAmount = paymentData.data()['amount'];
        final exactPaymentRef = db.collection("payments").doc(paymentData.id);

         // for individual and if amount matches
         if (amount == paymentAmount) {
            exactPaymentRef.update({
              "paid": true
            });
         }
      } else {
        // payment ref not found with trxID
        // so upload the trxID to reqTrxID collection
        db.doc("reqTrxID/$trxID").set({
          "createdAt": new DateTime.now().millisecondsSinceEpoch,
          "phoneNumber": phoneNumber,
          "amount": amount
        });
     }
  }
} catch (error) {
    print("error triggering to firestore: ${error.toString()}");
}
 

Моя ошибка заключалась в том, что я делал некоторые дополнительные выборки из firestore. И, поскольку документация firebase, сохранение firestore не будет работать ни при каком асинхронном (try / catch, promise, async / await) способе (что я делал так счастливо :)).

Как я решил это:

 FirebaseFirestore db = FirebaseFirestore.instance;

  db.doc("reqTrxID/$trxID").set({
    "createdAt": new DateTime.now().millisecondsSinceEpoch,
    "phoneNumber": phoneNumber,
    "amount": amount
  });
 

Я просто загружаю значение, которое мне нужно, и все необходимые проверки я отправляю в облачную функцию при запуске создания документа. Это решило мою проблему.