我有一个我的应用程序的提交表单,其中我有一些用户在表单中填写的数据。我需要在流程中从外部API获取GET,并使用该数据在数据库中创建一个条目。一旦按下提交按钮,就会发生这一切,然后我希望能够返回到我的主页路线。
我不知道如何在不使用FutureBuilder的情况下从Future函数获取数据,即使我不需要构建小部件,我只需要数据。
这就是我目前所拥有的:
_populateDB() {
return new FutureBuilder(
future: fetchPost(latitude, longitude),
builder: (context, snapshot) {
if (snapshot.hasData) {
_createJson(snapshot.data);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => HomeScreen()
),
);
} else if (snapshot.hasError) {
return new Text("${snapshot.error}");
}
return new CircularProgressIndicator();
},
);
}
当在屏幕上按下按钮时,将调用_populateDB()函数。我想要做的是从fetchPost(纬度,经度)获取数据,在函数_createJson(snapshot.data)中使用该数据,最后返回到HomeScreen()。
我还没有实现_createJson(snapshot.data),但是当我用onPressed调用这个方法时,它不会回到HomeScreen(),我不知道为什么。
您可以以异步方式或以同步方式从Future function
获取数据。
这很简单,你可以使用dart的Native Future API。方法then
是一个回调方法,在Future完成时调用。如果您的未来已经完成并出现了一些错误,您也可以使用catchError
方法。
fetchPost(latitude, longitude).then(
(fetchPostResultsData) {
if (fetchPostResultsData != null)
print (fetchPostResultsData);
} ).catchError(
(errorFromFetchPostResults){
print(errorFromFetchPostResults);
}
);
使用此方法,您的UI不会阻止来自网络的等待结果。
您可以使用Dart关键词async
和await
来保持您的呼叫同步。在你的情况下,你必须用_populateDB
方法转换你的async
方法,并从await
结果转换fetchPost
。
_populateDB() async {
var data = await fetchPost(latitude, longitude);
// just execute next lines after fetchPost returns something.
if (data !=null ){
_createJson(snapshot.data);
//... do your things
}
else {
//... your handle way
}
}
使用这种方法,你的_populateDB
函数将等待fetchPost
阻止UI Isolete的结果,并在获得结果后执行下一条指令。
关于导航如果你的HomeScreen是上一个上一个小部件堆栈你只需要Navigator.pop(context)
调用,但如果你的HomeScreen上面的堆栈中有其他小部件是一个更好的选择使用Navigator.pushReplacement
调用。
This文章详细介绍了Navigator
方法的效果。我希望它有所帮助。