我试图理解在Dart中使用async和await.不知何故,我在某些方法中返回值时遇到问题.
请考虑以下代码
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();
}
Run Code Online (Sandbox Code Playgroud)
mrn是int应该通过getMrn方法返回的类型.但是每次返回都会ss.val()返回null.似乎ss = event.snapshot在最后返回的值中没有看到
这样做的正确方法是什么.谢谢
在上面的代码中,您将匿名函数声明(event){..}为回调函数,并且您的return语句与之相关,而您的意图是return来自getMrn().
什么是你真正需要的,是要完成一个Future你从返回的getMrn()回调中.
像这样:
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;
}
Run Code Online (Sandbox Code Playgroud)
但如果第二个事件出现在mrnRef.onValue流中,那么该代码将无法正常工作.因此,假设mrnRef.onValue是a 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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |