Flutter:在读取 Firebase 数据时进行异步操作

Posted

技术标签:

【中文标题】Flutter:在读取 Firebase 数据时进行异步操作【英文标题】:Flutter: doing sthg asynchronous while reading Firebase data 【发布时间】:2019-05-18 04:57:45 【问题描述】:

我尝试在从 Firebase 读取数据时进行异步操作,但它不起作用,

这是我尝试过的:

Future<String> test() async 

  var cacheManager = await CacheManager.getInstance(); //await here is OKAY 

  DatabaseReference firebaseRef = FirebaseDatabase.instance.reference();
  firebaseRef.child('...').once().then((DataSnapshot snapshot) 
    Map<dynamic,dynamic> map = snapshot.value;
    map.forEach((key, url) 
       print('$key: $url');   //OKAY
       await precacheImage(new NetworkImage(url), context); //doesn't cache images
    );
  );
  return "";
 

我明白了:

错误:意外的令牌“等待”。

我也试过了:

Future<Map> test() async   //<---- added type Map
    ...
    map.forEach((key, url) async  //<--- added async
       //var file = await cacheManager.getFile(url);
       await precacheImage(new NetworkImage(url), context); //same, cache doesn't work
    );

但我明白了:

E/颤振(3971):#1 __InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.forEach (dart:collection/runtime/libcompact_hash.dart:370:8)

有什么想法吗?

【问题讨论】:

正如我的answer to your previous question 中所说,您需要将包含此代码的方法标记为async。每次使用 await 时都需要这样做。 当我用“async”标记方法然后我得到“异步暂停”,很抱歉,但我开始了,这个问题对我来说真的不明显 嗯?我以前从未有过。希望其他人知道如何解决这个问题。 我用另一种方法替换了 forEach 中的方法来尝试预缓存图像,但是图像的预加载不起作用:( url 无论如何都是正确的,奇怪... 【参考方案1】:

您将一个函数传递给then(...),并在该函数中使用await,为此,该函数需要标记为async。 将其他一些外部函数标记为async 是不够的。

firebaseRef.child('...').once().then((DataSnapshot snapshot) async  // async here was missing
    Map<dynamic,dynamic> map = snapshot.value;
    map.forEach((key, url) 
    print('$key: $url');   //OKAY
    var file = await cacheManager.getFile(url); // doesn't work
  );

它可能仍然无法正常工作,但这取决于您想用file 做什么,而您的问题并不清楚。

【讨论】:

谢谢,但还是不行,只有在map.forEach之外的“await”才有效,那怎么办? 没有看到它,因为 gormatting 很差。 mapthen 相同。 Xou 正在传递一个函数。 对不起,我没有看到格式,我编辑了代码以更好地可视化,那么如何处理地图,有什么想法吗? map.forEach((key, url) asyn 好的,我尝试的是正确的,但我收到了另一个错误消息,我用这个新问题编辑了问题,有什么想法吗?

以上是关于Flutter:在读取 Firebase 数据时进行异步操作的主要内容,如果未能解决你的问题,请参考以下文章

从登录用户创建的 Firebase 读取数据 - Flutter [关闭]

从 Firebase 读取数据 - Flutter

在 Flutter 中从 Firebase 实时数据库读取和存储数据

Firebase、Flutter - 读取、检索过滤后的数据

无法从Firebase数据库中读取数据 - Flutter

Flutter Web和Firebase身份验证TypeError:无法读取未定义的属性'app'