Flutter 为什么这个未来函数返回空列表
我是一个新的与颤振有问题的未来功能。我在另一个屏幕上有一个wait函数和它的返回列表,但当我在一个未来函数中使用多个wait函数时,它返回一个空列表,并在许多其他等待函数执行之前执行。我的问题是为什么我未来的函数会返回一个空列表我在互联网上尝试了几乎所有的方法请帮助Flutter 为什么这个未来函数返回空列表,flutter,dart,async-await,futuretask,flutter-futurebuilder,Flutter,Dart,Async Await,Futuretask,Flutter Futurebuilder,我是一个新的与颤振有问题的未来功能。我在另一个屏幕上有一个wait函数和它的返回列表,但当我在一个未来函数中使用多个wait函数时,它返回一个空列表,并在许多其他等待函数执行之前执行。我的问题是为什么我未来的函数会返回一个空列表我在互联网上尝试了几乎所有的方法请帮助 Future<List<AllShefz>> getAllShefz() async { List<AllShefz> allShefz = []; var data = a
Future<List<AllShefz>> getAllShefz() async {
List<AllShefz> allShefz = [];
var data = await FirebaseDatabase.instance
.reference()
.child("Resturants")
.once()
.then((DataSnapshot datasnapshot) async {
if (datasnapshot != null) {
Map<dynamic, dynamic> values = await datasnapshot.value;
values.forEach((key, value) async {
await FirebaseDatabase.instance
.reference()
.child("Resturants")
.child(key)
.child("Profile")
.once()
.then((DataSnapshot snapshot) async {
print(" I am here");
Map<dynamic, dynamic> newvals = await snapshot.value;
var position, name, gender, status;
if (await snapshot.value != null) {
position = await newvals["Position"];
name = await newvals["Name"];
gender = await newvals["Gender"];
status = await newvals["Status"];
if (position != null && status == "Approaved") {
var arr = ltlnClass().getSplit(position);
String latStr = arr[0];
String lngStr = arr[1];
String myPosition;
await new MyLocation()
.getMyLocation()
.then((value) => {myPosition = value.toString()});
var arr2 = ltlnClass().getSplit(myPosition);
String latStr2 = arr2[0];
String lngStr2 = arr2[1];
double lat2 = double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(latStr), latStr));
double lng2 = double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(lngStr), lngStr));
double lat1 = double.parse(ltlnClass()
.getLtlng(ltlnClass().getIndex(latStr2), latStr2));
double lng1 = double.parse(ltlnClass()
.getLtlng(ltlnClass().getIndex(lngStr2), lngStr2));
double distance =
DistanceCalculator().distance(lat1, lat2, lng1, lng2);
print("Lng 1" + lng1.toString());
print("Lng 2" + lng2.toString());
print("Lat 1" + lat1.toString());
print("Lat 2" + lat2.toString());
print("Distance is " + distance.toString());
AllShefz myShef =
new AllShefz(key, position, distance, gender, name, status);
setState(() {
allShefz.add(myShef);
});
}
}
return allShefz;
});
});
} else {
print("Null value found");
}
});
return allShefz;
}
```.
Future getAllShefz()异步{
列出所有SHEFZ=[];
var data=await FirebaseDatabase.instance
.reference()
.儿童(“餐厅”)
.一次
.then((DataSnapshot DataSnapshot)异步{
if(datasnapshot!=null){
映射值=wait datasnapshot.value;
forEach((键,值)异步{
等待FirebaseDatabase.instance
.reference()
.儿童(“餐厅”)
.儿童(钥匙)
.儿童(“档案”)
.一次
.then((DataSnapshot快照)异步{
打印(“我在这里”);
Map newvals=wait snapshot.value;
变量位置、名称、性别、状态;
if(wait snapshot.value!=null){
位置=等待新值[“位置”];
name=wait newvals[“name”];
性别=等待新值[“性别”];
状态=等待新值[“状态”];
如果(位置!=null&&status==approved){
var arr=ltlnClass().getSplit(位置);
字符串latStr=arr[0];
字符串lngStr=arr[1];
字符串位置;
等待新的MyLocation()
.getMyLocation()
.then((value)=>{myPosition=value.toString()});
var arr2=ltlnClass().getSplit(myPosition);
字符串latStr2=arr2[0];
字符串lngStr2=arr2[1];
double lat2=double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(latStr),latStr));
double lng2=double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(lngStr),lngStr));
double lat1=double.parse(ltlnClass()
.getLtlng(ltlnClass().getIndex(latStr2),latStr2));
double lng1=double.parse(ltlnClass())
.getLtlng(ltlnClass().getIndex(lngStr2),lngStr2));
双倍距离=
距离计算器().距离(lat1、lat2、lng1、lng2);
打印(“Lng 1”+lng1.toString());
打印(“Lng 2”+lng2.toString());
打印(“Lat 1”+lat1.toString());
打印(“Lat 2”+Lat 2.toString());
打印(“Distance is”+Distance.toString());
麦舍夫酒店=
新AllShefz(键、位置、距离、性别、姓名、状态);
设置状态(){
allShefz.add(myShef);
});
}
}
返回allShefz;
});
});
}否则{
打印(“找到空值”);
}
});
返回allShefz;
}
```.
您似乎在混合。然后
和等待
呼叫。这是可能的,但对于初学者来说极易出错(坦率地说,即使是专家,如果他们还没有正确的咖啡因剂量)
我建议您删除所有
。然后
继续,并将其替换为等待
。这样,您就可以正确地调试代码,并找出在等待异步调用时错过的地方。您的缩进级别应该缩小到可以管理的程度,这样您就可以很容易地发现错误。您似乎在混合。然后和等待调用。这是可能的,但对于初学者来说极易出错(坦率地说,即使是专家,如果他们还没有正确的咖啡因剂量)
我建议您删除所有。然后
继续,并将其替换为等待
。这样,您就可以正确地调试代码,并找出在等待异步调用时错过的地方。缩进级别应该缩小到可以管理的程度,这样您就可以很容易地发现错误。正如@nvoigt所提到的,您应该更改代码。现在,您可以轻松地一步一步地调试结果
Future<List<AllShefz>> getAllShefz() async {
List<AllShefz> allShefz = [];
var datasnapshot =
await FirebaseDatabase.instance.reference().child("Resturants").once();
if (datasnapshot != null) {
Map<dynamic, dynamic> values = await datasnapshot.value;
values.forEach((key, value) async {
var snapshot = await FirebaseDatabase.instance
.reference()
.child("Resturants")
.child(key)
.child("Profile")
.once();
print(" I am here");
Map<dynamic, dynamic> newvals = await snapshot.value;
var position, name, gender, status;
if (await snapshot.value != null) {
position = await newvals["Position"];
name = await newvals["Name"];
gender = await newvals["Gender"];
status = await newvals["Status"];
if (position != null && status == "Approaved") {
var arr = ltlnClass().getSplit(position);
String latStr = arr[0];
String lngStr = arr[1];
String myPosition;
var value = await new MyLocation().getMyLocation();
myPosition = value.toString();
var arr2 = ltlnClass().getSplit(myPosition);
String latStr2 = arr2[0];
String lngStr2 = arr2[1];
double lat2 = double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(latStr), latStr));
double lng2 = double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(lngStr), lngStr));
double lat1 = double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(latStr2), latStr2));
double lng1 = double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(lngStr2), lngStr2));
double distance =
DistanceCalculator().distance(lat1, lat2, lng1, lng2);
print("Lng 1" + lng1.toString());
print("Lng 2" + lng2.toString());
print("Lat 1" + lat1.toString());
print("Lat 2" + lat2.toString());
print("Distance is " + distance.toString());
AllShefz myShef =
new AllShefz(key, position, distance, gender, name, status);
setState(() {
allShefz.add(myShef);
});
}
}
return allShefz;
});
} else {
print("Null value found");
}
return allShefz;
}
Future getAllShefz()异步{
列出所有SHEFZ=[];
var数据快照=
等待FirebaseDatabase.instance.reference().child(“Resturants”).once();
if(datasnapshot!=null){
映射值=wait datasnapshot.value;
forEach((键,值)异步{
var snapshot=wait FirebaseDatabase.instance
.reference()
.儿童(“餐厅”)
.儿童(钥匙)
.儿童(“档案”)
.一次();
打印(“我在这里”);
Map newvals=wait snapshot.value;
变量位置、名称、性别、状态;
if(wait snapshot.value!=null){
位置=等待新值[“位置”];
name=wait newvals[“name”];
性别=等待新值[“性别”];
状态=等待新值[“状态”];
如果(位置!=null&&status==approved){
var arr=ltlnClass().getSplit(位置);
字符串latStr=arr[0];
字符串lngStr=arr[1];
字符串位置;
var value=等待新的MyLocation().getMyLocation();
myPosition=value.toString();
var arr2=ltlnClass().getSplit(myPosition);
字符串latStr2=arr2[0];
字符串lngStr2=arr2[1];
double lat2=double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(latStr),latStr));
double lng2=double.parse(
ltlnClass().getLtlng(ltlnClass().getIndex(lngStr),lngStr));
double lat1=double.parse(
ltlnClass().getLtlng(ltlnClass().getIn