Firebase once() 方法不等待 Flutter

Posted

技术标签:

【中文标题】Firebase once() 方法不等待 Flutter【英文标题】:Firebase once() method does not wait on Flutter 【发布时间】:2021-04-27 10:02:48 【问题描述】:

您好,我想从 firebase 数据库中获取数据方法,应该等到它返回该值。

Future<List<Book>> whichBooksUserHave() async 
    List<Book> books = [];
    DatabaseReference ref =
        databaseReference.child('User').child(_userKey).child('Books');
    //DataSnapshot snapshot = await ref.once();

    await ref.once().then((snapshot) 
      snapshot.value.forEach((key, value) 
        if (value['starred'] == '1') 
          books.add(_getBookWithIdFromFirebase(key));
        
      );
      return books;
    );
    print('buraya girdi usta ! ');
    return books;
  

这就是我打电话的地方

Future<ParsedResponse<List<Book>>> getBooks(String input) async 
...
List<Book> firebaseBook = await FirebaseController.get().whichBooksUserHave();
...

但它不让等待whichBooksUserHave方法完成。

【问题讨论】:

我也有同样的问题。奇怪的是,在某些查询上它可以正常工作,但在其他查询上却不行。你知道这是从哪里来的吗? 【参考方案1】:

这将帮助您添加一个加载屏幕,直到值加载。如果没有,你需要使用 await。

 Widget futureBuilder() 
            return FutureBuilder<List<Project>>(
              future: _getBooks(),
              builder: (context, snapshot) 
                debugPrint('Builder');
                switch (snapshot.connectionState) 
                  case ConnectionState.done:
                    if (snapshot.hasError)
                      return new Text('Error: $snapshot.error');
                    else
                      return listWidget(snapshot);
                    break;
    
                  default:
                    debugPrint("Snapshot " + snapshot.toString());
                  return Container() // also check your listWidget(snapshot) as it may return null.
                
              ,
            );
      

【讨论】:

以上是关于Firebase once() 方法不等待 Flutter的主要内容,如果未能解决你的问题,请参考以下文章

Firebase .orderByChild().equalTo().once().then() 当孩子不存在时承诺

为啥 Firebase 会在 once() 函数之外丢失引用?

Firebase“一次”事件不返回承诺

使用 require_once() 或不使用 require_once()

如何使用 java/android 从 Firebase ONCE 读取数据?

当.keepSynced(true)时,Firebase Realtime .once()是否仍会下载整个节点?]