Как прочитать локальный файл, когда нет флаттера? - PullRequest
0 голосов
/ 04 июля 2018

Я реализовал ListView, который загружает 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 голосов
/ 04 июля 2018

Вы неправильно используете asnyc await и обещания . При использовании await вы не должны использовать then, потому что они делают то же самое. Проверьте это для справки по Future.

Вы также возвращаете из неправильной области , т.е. оба ваших return возврата к обратным вызовам , а не к вашей функции getPosts . Я перепишу getPosts с async await и try catch.

Строки после await выполняются только после завершения Future. Подробнее об этом здесь .

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);
  }
}
...