同步返回一个值并在dart中等待

st_*_*rke 2 dart

我试图理解在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)

mrnint应该通过getMrn方法返回的类型.但是每次返回都会ss.val()返回null.似乎ss = event.snapshot在最后返回的值中没有看到

这样做的正确方法是什么.谢谢

Mik*_*ike 5

在上面的代码中,您将匿名函数声明(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)