Firestore fails to retrieve data after reconnecting to the Internet

后端 未结 4 696
臣服心动
臣服心动 2021-02-02 12:44

I\'m using Firestore with the Android SDK (11.6.2) and I\'m hitting an exception when my device was offline and reconnects to the Internet.

When requesting a document, f

相关标签:
4条回答
  • 2021-02-02 13:02

    this may help

    Java:

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    
    //to reconnect
    db.terminate();
    db = FirebaseFirestore.getInstance();
    

    Kotlin:

    var db = Firebase.firestore
    
    //to reconnect
    db.terminate()
    db = Firebase.firestore
    
    0 讨论(0)
  • 2021-02-02 13:04

    From the official documentation:

    To use offline persistence, you don't need to make any changes to the code that you use to access Cloud Firestore data. With offline persistence enabled, the Cloud Firestore client library automatically manages online and offline data access and synchronizes local data when the device is back online.

    When you initialize Cloud Firestore, you can enable or disable offline persistence. So, when using the following line of code:

    val firestoreSettings = FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build()
    

    You actually set the persistence to false, you are disabling this feature. To solve this, just remove this line of code. Firestore has .setPersistenceEnabled(true) by default.

    0 讨论(0)
  • 2021-02-02 13:11

    This issue was fixed by the release 17.1.5 of Cloud Firestore.

    See the official changelog https://firebase.google.com/support/release-notes/android

    Cloud Firestore now recovers more quickly from bad network states.


    Using my reproduction project with the version 18.0.0, the issue is indeed not present.

    0 讨论(0)
  • 2021-02-02 13:12

    I also have the same problem. There is workaround - application waits some time and makes another attempt to get the data from server.

    Here is mockup (this is Flutter/dart):

       List<Course> items;
    
       Widget build(BuildContext context) {
        ...
        loadData();
        ...
        //building th UI with data from items list
        ...
       }
    
    
        loadData() async {        
            //is not loaded but there is internet connection
            if (!isLoaded&&isConnected) {
              try {
                  querySnapshot = await query.getDocuments(source: Source.server);
                } 
                catch (ex) {
                  print(ex);
                  Future.delayed(Duration(seconds: 10), () {
                  // setState to trigger build 10 seconds later to make one more attempt
                      setState(() {
                          isLoaded = false;
                      });
                  });
              return;
            }
        // here goes the code to handle the result 
        items =  querySnapshot.documents.map((s) => Course.fromDb(s)).toList();
        }
    
    0 讨论(0)
提交回复
热议问题