Flutter futurebuilder 嵌套期货返回 null
Flutter futurebuilder nested futures returning null
我正在尝试使用不同的用户角色,登录后他们应该被定向到不同的页面,但是我正在尝试使用 futurebuilder 来这样做 returns null。 element.data['role'] 是正确的,在返回 future 之前被打印出来,但没有返回给 futurebuilder。
Future<String> getUserRole() async {
final result = await FirebaseAuth.instance.currentUser().then(
(user) async {
await Firestore.instance.collection("Users").getDocuments().then(
(docs) {
docs.documents.forEach((element) {
print(element.documentID);
print(user.uid);
if (element.documentID == user.uid) {
print(element.data['role']);
return element.data['role'];
}
});
},
);
},
);
return result;
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: getUserRole(),
builder: (ctx, AsyncSnapshot<String> futureResult) {
if (futureResult.connectionState == ConnectionState.waiting) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
} else if (futureResult.hasError) {
Center(
child: Text("Error"),
);
} else if (futureResult.hasData) {
print("BUILDER");
print(futureResult.data);
if (futureResult.data == "Employer") {
return EmployerTabsScreen();
} else {
return EmployeeTabsScreen();
}
} else {
return Text("NONE");
}
},
);
}
尝试在所有迭代中调用 return 并添加 null
(或其他值)以处理您没有 return 数据的情况:
Future<String> getUserRole() {
return FirebaseAuth.instance.currentUser().then((user) {
return Firestore.instance.collection("Users").getDocuments().then((docs) {
var role = null;
docs.documents.forEach((element) {
print(element.documentID);
print(user.uid);
if (element.documentID == user.uid) {
print(element.data['role']);
role = element.data['role'];
}
});
return role;
});
});
}
因为你随机混合了“async/await”和“then”回调。
猜猜这样做并没有错,但是就像在您的示例中一样,它完全可读并且使一切都变得比它可能更难。
最初:
final result = await FirebaseAuth.instance.currentUser().then(
(user) async {
如果您将某些内容声明为“等待”,则不需要回调。你应该声明结果正确。如果你想对结果做些什么,也可以将新请求作为等待。而已。如果您有此响应,请接受它和 lambda 或 foreach。
最后一步是,检查你得到了什么并 return 它。
当你做出“承诺”时“等待”某事是没有意义的(在 javascript 中说)
我正在尝试使用不同的用户角色,登录后他们应该被定向到不同的页面,但是我正在尝试使用 futurebuilder 来这样做 returns null。 element.data['role'] 是正确的,在返回 future 之前被打印出来,但没有返回给 futurebuilder。
Future<String> getUserRole() async {
final result = await FirebaseAuth.instance.currentUser().then(
(user) async {
await Firestore.instance.collection("Users").getDocuments().then(
(docs) {
docs.documents.forEach((element) {
print(element.documentID);
print(user.uid);
if (element.documentID == user.uid) {
print(element.data['role']);
return element.data['role'];
}
});
},
);
},
);
return result;
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: getUserRole(),
builder: (ctx, AsyncSnapshot<String> futureResult) {
if (futureResult.connectionState == ConnectionState.waiting) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
} else if (futureResult.hasError) {
Center(
child: Text("Error"),
);
} else if (futureResult.hasData) {
print("BUILDER");
print(futureResult.data);
if (futureResult.data == "Employer") {
return EmployerTabsScreen();
} else {
return EmployeeTabsScreen();
}
} else {
return Text("NONE");
}
},
);
}
尝试在所有迭代中调用 return 并添加 null
(或其他值)以处理您没有 return 数据的情况:
Future<String> getUserRole() {
return FirebaseAuth.instance.currentUser().then((user) {
return Firestore.instance.collection("Users").getDocuments().then((docs) {
var role = null;
docs.documents.forEach((element) {
print(element.documentID);
print(user.uid);
if (element.documentID == user.uid) {
print(element.data['role']);
role = element.data['role'];
}
});
return role;
});
});
}
因为你随机混合了“async/await”和“then”回调。 猜猜这样做并没有错,但是就像在您的示例中一样,它完全可读并且使一切都变得比它可能更难。
最初:
final result = await FirebaseAuth.instance.currentUser().then(
(user) async {
如果您将某些内容声明为“等待”,则不需要回调。你应该声明结果正确。如果你想对结果做些什么,也可以将新请求作为等待。而已。如果您有此响应,请接受它和 lambda 或 foreach。 最后一步是,检查你得到了什么并 return 它。 当你做出“承诺”时“等待”某事是没有意义的(在 javascript 中说)