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。我将用getPosts
和async 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 从本地文件中读取内容?
如何在 Dart/Flutter 中读取本地图像文件的字节数?