颤振中没有互联网连接时如何读取本地文件?

时间:2018-07-04 14:17:49

标签: dart flutter dart-async

我已经实现了一个ListView,它可以从Internet加载Json。到目前为止,一切都很好。 但是我想读取本地文件,以防尝试读取在线json失败。

我有一个异步方法,可以从互联网或本地资产读取json:

Future<List<Post>> getPosts(String urlJsonInternet, String fileJsonLocal) async {

  //read json from internet
  await http.get(urlJsonInternet).then((responseInternet) {

      //If server returns an OK response, parse the JSON
      return _buildPostList(responseInternet.body);

  }).catchError((onError) {

     //read json from local file
     rootBundle.loadString(fileJsonLocal).then((responseLocal) {
        return _buildPostList(responseLocal);
     });

  });

}

_buildPostList这只是解析json的方法。

要进行测试,我在Android模拟器上关闭了网络。

正在发生的事情是FutureBuilder的快照没有返回任何内容。似乎与流程的执行顺序有关。

这是该异常的屏幕截图:https://ibb.co/iMSRsJ

1 个答案:

答案 0 :(得分:0)

您错误地使用了asnyc await承诺。使用await时,请勿使用then,因为它们的作用完全相同。在Future上检查this out以供参考。

您也是从错误范围中返回 ,即您的return都返回了回调您的函数 getPosts 。我将用getPostsasync await重写try catch

await之后的行仅在Future完成后才执行。 More on that here

Future<List<Post>> getPosts(String urlJsonInternet, String fileJsonLocal) async {
  try {
    //read json from internet
    final responseInternet = await http.get(urlJsonInternet);

    //If server returns an OK response, parse the JSON
    return _buildPostList(responseInternet.body);
  } catch (e) {
    //read json from local file
    final responseLocal = await rootBundle.loadString(fileJsonLocal);

    return _buildPostList(responseLocal);
  }
}