我从firebase实时数据库中获取一个特定的数据集,并尝试返回映射的单个值。它可以在地图上打印变量,但我无法返回。
在这种情况下,函数get_Name应该返回值"0";迈克尔;
实时数据库结构:
组
-MdXLzrGo4qIGO67ujNM
-MadXT0oysMDxqFQ5KurB
Me4Kpz1He0v1QuH2e7Z
castDate:">
castLocation:"quot
castName:"迈克尔
void initState() {
test = get_Name("-Me4Kpz1He0v1QuH2e7Z");
print(test);
super.initState();
}
get_Name(String GroupID){
var Name;
DatabaseReference db;
db = FirebaseDatabase.instance.reference().child("group");
db.orderByKey().equalTo(GroupID).once().then((DataSnapshot snapshot){
Map<dynamic, dynamic> DB_value = snapshot.value;
DB_value.forEach((key,values) {
Name =values["castName"];
print(Name); // prints "Michael"
});
});
return Name; //returns "NULL"
}
提前感谢
伯恩哈德
当前代码的问题是缺少对.then()
将在返回Name
之后异步执行的理解。
试着把方法重写成这样,我们把方法标记为async
,这允许我们使用await
而不是.then()
,这使代码更容易理解:
Future<String> get_Name(String GroupID) async {
String name;
final db = FirebaseDatabase.instance.reference().child("group");
final snapshot = await db.orderByKey().equalTo(GroupID).once();
Map<dynamic, dynamic> DB_value = snapshot.value;
DB_value.forEach((key, values) {
name = values["castName"] as String;
print(name); // prints "Michael"
});
return name; //returns "NULL"
}
该方法的返回值为Future<String>
(async
标记的方法需要Future
(,表示调用get_Name
的方法也需要await
作为答案,因为所有内容都将异步执行。
从then块内部返回就可以了。
get_Name(String GroupID){
var Name;
DatabaseReference db;
db = FirebaseDatabase.instance.reference().child("group");
db.orderByKey().equalTo(GroupID).once().then((DataSnapshot snapshot){
Map<dynamic, dynamic> DB_value = snapshot.value;
DB_value.forEach((key,values) {
Name =values["castName"];
print(Name); // prints "Michael"
});
return Name;
});
}
但是,在循环中也要多次指定"名称"。这是有意的吗?否则,您应该使用数组来推送其中的所有项目。