gpt4 book ai didi

dart - 从 FutureBuilder 导航回页面

转载 作者:IT王子 更新时间:2023-10-29 07:03:38 26 4
gpt4 key购买 nike

我有一个应用程序提交表单,用户在表单中填写了一些数据。我需要在此过程中从外部 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 函数 获取数据。

1 异步方式

很简单,您可以使用 dart 中的 Native Future API。 then 方法是一个回调方法,在您的 Future 完成时调用。如果您的 future 完成时出现错误,您也可以使用 catchError 方法。

fetchPost(latitude, longitude).then(  
(fetchPostResultsData) {
if (fetchPostResultsData != null)
print (fetchPostResultsData);
} ).catchError(
(errorFromFetchPostResults){
print(errorFromFetchPostResults);
}
);

使用这种方法,您的 UI 不会阻塞等待来自网络的结果。

2同步方式

您可以使用 Dart 关键字 asyncawait 来保持调用同步。在您的情况下,您必须将 _populateDB 方法转换为 async 方法,并从 fetchPost 结果中await

_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 上面的 Stack 中还有其他小部件是更好的选择使用 Navigator.pushReplacement 调用。

This文章通过插图详细展示了Navigator方法的效果。希望对您有所帮助。

关于dart - 从 FutureBuilder 导航回页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55815246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com