gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:44:05 26 4
gpt4 key购买 nike

我想了解 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();
}

mrnint 类型,应该由 getMrn 方法返回。但是,每次返回的 ss.val() 都会返回 null。上次返回值好像没有看到ss = event.snapshot

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

最佳答案

在上面的代码中,您将匿名函数 (event){..} 声明为回调,您的 return 语句与之相关,而您的意图是从getMrn()返回

您真正需要的是完成您从回调中的getMrn() 返回的Future

像这样:

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();
}

关于dart - 同步返回一个值并在 Dart 中等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31072085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com