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

returning a value in sync and await in 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();
}

mrn 属于 int 类型,应由 getMrn 方法返回。但是每次都返回ss.val()returnsnull。上次返回的值

好像没有看到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;
}

但是如果 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();
}