flutter上没有互联网连接时如何读取本地文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter上没有互联网连接时如何读取本地文件?相关的知识,希望对你有一定的参考价值。

我已经实现了一个从Internet加载Json的ListView。到现在为止还挺好。但我想读取一个本地文件,以防尝试读取在线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的Snapshot没有返回任何内容。它似乎与进程的执行顺序有关。

这是例外的截图:https://ibb.co/iMSRsJ

答案

你正在错误地使用asnyc await和承诺。当使用await时,你不应该使用then,因为它们完全相同。检查this out以获取Future的参考。

你也是从错误的范围返回,即你的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);
  }
}

以上是关于flutter上没有互联网连接时如何读取本地文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter for Web 从本地文件中读取内容?

如何在flutter中读取本地json导入?

如何在 Flutter 上持续检查互联网连接与否?

如何在 Dart/Flutter 中读取本地图像文件的字节数?

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?

如何在 Flutter 中从 firebase 存储读取和写入文本文件?