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 很差。map
与 then
相同。 Xou 正在传递一个函数。
对不起,我没有看到格式,我编辑了代码以更好地可视化,那么如何处理地图,有什么想法吗?
map.forEach((key, url) asyn
好的,我尝试的是正确的,但我收到了另一个错误消息,我用这个新问题编辑了问题,有什么想法吗?以上是关于Flutter:在读取 Firebase 数据时进行异步操作的主要内容,如果未能解决你的问题,请参考以下文章
从登录用户创建的 Firebase 读取数据 - Flutter [关闭]
在 Flutter 中从 Firebase 实时数据库读取和存储数据