从FutureBuilder导航回页面

问题描述 投票:1回答:1

我有一个我的应用程序的提交表单,其中我有一些用户在表单中填写的数据。我需要在流程中从外部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(),我不知道为什么。

dart flutter future
1个回答
0
投票

您可以以异步方式或以同步方式从Future function获取数据。

1 Asynchronous way

这很简单,你可以使用dart的Native Future API。方法then是一个回调方法,在Future完成时调用。如果您的未来已经完成并出现了一些错误,您也可以使用catchError方法。

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

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

2 Synchronous way

您可以使用Dart关键词asyncawait来保持您的呼叫同步。在你的情况下,你必须用_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方法的效果。我希望它有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.