我已经实现了一个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
答案 0 :(得分:0)
您错误地使用了asnyc
await
和承诺。使用await
时,请勿使用then
,因为它们的作用完全相同。在Future
上检查this out以供参考。
您也是从错误范围中返回 ,即您的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);
}
}