在Flutter中的实例'Future'
在Flutter中的实例'Future'
我从Flutter中的HTTP请求中的服务器获取一个整数Id,一切都正常,我想将这个值保存在一个变量中,但是当我调用返回的值时,我得到了一个"Instance of 'Future'"的错误,有什么建议吗?
以下是代码:
child: RaisedButton(onPressed:() {
CurrentPrjId = SaveProject();
print("当前的CurrentPrjId已保存为:");
print(CurrentPrjId);
Navigator.of(context).pushReplacementNamed('/AllUSerStories');
}
//保存项目
Future SaveProject() async {
//SaveProjectResult保存了当前创建项目的id,我需要用它来获取项目的用户故事
var SaveProjectResult = await GetPostProjects().createProject(_ProjectnameController.text, _CustomernameController.text, _dropNewItem, _dropNewItem2, _StartDateController.text, _EndDateController.text);
print(":::::::::::::::::::::::::::::::项目已创建,这是SaveProject中的ID:::::::::");
print(SaveProjectResult);
return SaveProjectResult;
}
问题原因:
在Flutter中,当我们使用异步调用时,可能会遇到'Instance of 'Future
解决方法:
要解决这个问题,我们需要使用FutureBuilder小部件来获取异步调用的结果。FutureBuilder小部件接受一个Future对象,并根据异步调用的不同状态来构建不同的小部件。
下面是解决问题的代码示例:
CurrentPrjId = FutureBuilder
future: SaveProject(),
builder: (context, snapshot) {
if (snapshot.hasData) return Text(snapshot.data);
else if (snapshot.hasError) return Text(snapshot.error);
return Text("Await for data");
},
);
在上面的代码中,我们使用FutureBuilder小部件来获取SaveProject()异步调用的结果。在builder属性中,我们根据不同的异步调用状态来构建不同的小部件。
如果异步调用已经完成并且返回数据,我们将显示数据的文本。如果异步调用发生错误,我们将显示错误的文本。如果异步调用还没有完成,我们将显示"Await for data"文本。
通过使用FutureBuilder小部件,我们可以正确地获取异步调用的结果,并避免出现'Instance of 'Future
问题的出现原因:
根据给出的信息很难确定具体发生了什么,但你可以尝试等待未来的完成。可以通过以下方式解决该问题:
methOdThatLoadsId().then((id) => print("Id that was loaded: $id"));
或者
var id = await methodThatLoadsId();
祝好运 🙂
我使用了你的第一种解决方案,但仍然遇到了相同的问题:Instance of 'Future'。
我们如何在initState函数中使用await?谢谢。
据我所知,在initState函数中根本不可能这样做。然而,有几种方法可以在initState中处理异步任务。查看stackoverflow.com/a/51901192/11266880获取一种解决方案。