在我的Flutter应用中,我有一些嵌套的Future
作业可以执行。例如,我首先需要从Firebase获取当前用户的电子邮件,然后根据收到的电子邮件从数据库中提取正确的用户。
我已经在下面实现了
class LoadSellAdsUIState extends State<LoadSellAdsUI> {
FirebaseUser firebaseUser;
User user;
bool startUILoad=false;
@override
void initState() {
// TODO: implement initState
super.initState();
Future.wait([
FirebaseJobs.getCurrentUser().then((firebaseUserTemp) {
if (firebaseUserTemp != null) {
firebaseUser = firebaseUserTemp;
DataFetch()
.loadUser(AppNavigation.getAPIUrl() +"user/getUserByEmail/" +firebaseUser.email)
.then((User userTemp) {
if(user!=null)
{
user = userTemp;
print(user.email + " : " + user.iduser.toString());
}
setState(() {
startUILoad=true;
});
});
}
})
]);
}
//other code here
}
我的Future
是在另一个类中定义的,下面是上述Future
s的代码
static final FirebaseAuth _auth = FirebaseAuth.instance;
static Future<FirebaseUser> getCurrentUser()
{
return _auth.currentUser();
}
Future<User> loadUser(String url) async {
final response = await http.get(url);
if (response.statusCode == 200) {
return User.fromJson(convert.json.decode(response.body));
} else {
throw Exception('Failed to load post');
}
}
请注意,我正在Future
方法内使用initState
。
问题在于代码从不等待内部的Future
(DataFetch().loadUser()
)),并且始终移至build
方法。
如何解决此问题?
答案 0 :(得分:0)
我借助布尔值来监视Future
的状态来解决此问题。代码在下面
@override
void initState() {
// TODO: implement initState
super.initState();
//IF THE USER IS NOT LOGGED IN, DIRECT THE USER TO LOGIN
FirebaseJobs.getCurrentUser().then((firebaseUser){
if(firebaseUser==null)
{
setState(() {
startUILoad=true;
});
}
else{
firebaseUser1 = firebaseUser;
DataFetch().loadUser(AppNavigation.getAPIUrl()+"user/getUserByEmail/"+firebaseUser.email).then((User result)
{
user = result;
setState(() {
startUILoad=true;
});
});
}
});
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return startUILoad? sellAdFutureBuilder() : Center(child: CircularProgressIndicator(),);
}