dart - 从 FutureBuilder 导航回页面
问题描述
我的应用程序有一个提交表单,其中有一些用户在表单中填写的数据。我需要在此过程中从外部 API 获取,并使用该数据在数据库中创建一个条目。一旦按下提交按钮,所有这一切都会发生,然后我希望能够回到我的主页路线。
我不确定如何在不使用 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(latitude, longitude) 获取数据,在函数 _createJson(snapshot.data) 中使用该数据,最后返回 HomeScreen()。
我还没有实现 _createJson(snapshot.data),但是目前当我用 onPressed 调用这个方法时,它不会回到 HomeScreen(),我不知道为什么。
解决方案
您可以通过Future function
异步方式或同步方式获取数据。
1 异步方式
很简单,你可以使用 dart 中的 Native Future API。该方法then
是一个回调方法,在您的 Future 完成时调用。catchError
如果您的未来因某些错误完成,您也可以使用方法。
fetchPost(latitude, longitude).then(
(fetchPostResultsData) {
if (fetchPostResultsData != null)
print (fetchPostResultsData);
} ).catchError(
(errorFromFetchPostResults){
print(errorFromFetchPostResults);
}
);
使用这种方法,您的 UI 不会被阻止等待来自网络的结果。
2 同步方式
您可以使用 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
调用是更好的选择。
本文详细说明了Navigator
方法的效果。我希望它有所帮助。
推荐阅读
- jenkins - 如何使用 Jenkinsfile 将文件从 Jenkins 代理节点复制到远程服务器
- c# - 如何在 kendo UI 模板中检查字符串是否包含逗号
- c# - 运行时 WPF 拖动控制
- ios - UI 按钮未显示在情节提要上,但显示在模拟器上
- python - 在 Jupyter Notebook 中运行 Python 代码时出现问题:GoodReadsScraper
- flutter - 按钮单击时颤动创建动态TextField
- rspec - RSpec bisect 运行不明确
- node.js - 无服务器 Lamba - 功能未完全执行
- java - Spring Boot 配置约定
- python - 您如何过滤 django-oscar 产品以仅显示特定类别的产品?