我试图理解在Dart中使用async和等待。不知怎的,我在某些方法中返回值时遇到了问题。
考虑以下代码
Future<int> getMrn() async {
var mrnRef = await firebaseClient.child('mrn');
DataSnapshot ss;
StreamSubscription<Event> onValueSubscription = await mrnRef.onValue
.listen((event) {
ss = event.snapshot;
return ss.val();
});
//return Future<int> ss.val();
}
mrn
属于int
类型,应由getMrn
方法返回。但是每次返回的ss.val()
都会返回null
。似乎在最后返回的值中看不到ss = event.snapshot
这样做的正确方法是什么。 感谢
答案 0 :(得分:5)
在上面的代码中,您将匿名函数(event){..}
声明为回调,并且您的return
语句与之相关,而您的意图是return
来自{getMrn()
1}}。
您实际需要的是完成 Future
您在回调中从getMrn()
返回。{/ p>
像这样:
Future<int> getMrn() async {
var mrnRef = await firebaseClient.child('mrn');
Completer<int> c = new Completer<int>();
StreamSubscription<Event> onValueSubscription = await mrnRef.onValue
.listen((event) {
DataSnapshot ss = event.snapshot;
c.complete(ss.val());
});
return c.future;
}
但如果mrnRef.onValue
流中出现第二个事件,那么该代码将无法正常工作。因此,假设mrnRef.onValue
是Stream
,并且您只需要第一个事件,那么最好以这种方式重写它:
Future<int> getMrn() async {
var mrnRef = await firebaseClient.child('mrn');
Event event = await mrnRef.onValue.first;
DataSnapshot ss = event.snapshot;
// note, you're implicitly returning a Future<int> here,
// because our function is asyncronous
return ss.val();
}