我试图在我的函数中获得返回值,但输出是'未来的实例'而不是数据库中学校字段名称的值
@override
void initState() {
userId = _auth.currentUser!.uid;
publisherSchool =
getName(widget.postInfo['publisher-Id'], 'school').toString();
super.initState();
}
Future getName(String publisherUid, String fieldname) async {
DocumentSnapshot publisherSnapshot = await FirebaseFirestore.instance
.collection('users')
.doc(publisherUid)
.get();
print(publisherSnapshot.get(fieldname));
return publisherSnapshot.get(fieldname);
}
但每当我打印publishersnap .get(fieldname)我得到正确的值从数据库
有两种方法可以做到这一点,您可以创建一个Future
方法并在initState
中调用它,如下所示:
@override
void initState() {
initial();
super.initState();
}
Future<void> initial() async {
userId = _auth.currentUser!.uid;
// Remember using `()` to wrap the `await` to get it result
publisherSchool = (await getName(widget.postInfo['publisher-Id'], 'school')).toString();
}
或者您可以使用.then
直接在initState
内部调用它:
@override
void initState() {
userId = _auth.currentUser!.uid;
getName(widget.postInfo['publisher-Id'], 'school').then((value) {
publisherSchool = value.toString();
});
super.initState();
}
当你声明getName()
函数时,指定返回类型为Future<String>
,然后当你调用getName()
时,你需要等待结果,例如publisherSchool = await getName(widget.postInfo['publisher-Id'], 'school').toString();
没有得到正确响应的原因是,无论何时使用Futures,都需要一些时间来完成并返回结果。与此同时,它正在获取结果,你必须让它等待,以便程序将继续一旦未来的功能完成,因为await/then在你的代码中无处可寻,因此问题。
要解决这个问题,可以做如下修改:
publisherSchool =
getName(widget.postInfo['publisher-Id'], 'school').toString();
getName(widget.postInfo['publisher-Id'],
'school').then((value){
publisherSchool=value.toString()});