Не удалось получить данные API - PullRequest
0 голосов
/ 19 октября 2018

Прежде всего, извините, если это длинный вопрос, так как он имеет ссылки gist, а также блоки длинного кода.Я хочу получить данные API и отобразить их в listview. Это структура json. Этот является классом, представляющим json.Container для отображения в пользовательском интерфейсе:

Widget reviewsSection = Container(
        child: FutureBuilder(
            future: _fetchReviews(),
            builder: (context, snapshot) {
              if (reviewList != null) {
                return _buildReviewTiles();
              } else if (snapshot.hasError) {
                return Text('${snapshot.error}',
                    style: TextStyle(color: Colors.white, fontSize: 12.0),
                    textAlign: TextAlign.justify);
              }
              // By default, show a loading spinner
              return new Container(child: CircularProgressIndicator());
            })
    );

И вот как я получаю данные:

Future <Null> _fetchReviews() async {

    // Review URL
    final String url = 'https://..';

    // Authorization token
    final String auth = '';

    // Asynchronous JSON from server
    final response = await http.get(url + 'id=${this.pro.id}' + '&k=$auth');


    // If the request was successful
    if (response.statusCode == 200) {

        // Convert the JSON response to a list
      final parsed = json.decode(response.body);

        // Adds review objects to reviewList
      for (int i = 0; i < parsed.length; i ++) {
        reviewList.add(new Review.fromJSON(parsed, i));
      }
    }
    else {
      throw('HTTP request failed, statusCode: ${response?.statusCode}');
    }
  }

  // Updates reviewList
  Future<Null> _refresh() async {
    await _fetchReviews();
  }

Создание listview на основе отзывов:

  Widget _buildReviewTiles() {
    return (new Container(
        child: new RefreshIndicator(
            child: ListView.builder(
              shrinkWrap: true,
                itemCount: reviewList == null ? 0 : reviewList.length,
                itemBuilder: (BuildContext context, int index) {
                  return new Container(
                      child: Center(
                          child: Column(children: <Widget>[
                            _getReviewTile(reviewList[index]),
                          ])));
                }),
            onRefresh: _refresh
        )
    )
    );
  }

И это возвращает list tile.Это мой первый раз, когда я имею дело с apis в трепетании.Я попытался отладить и узнал, что размер reviewsList равен 0, это может быть причиной, но я не уверен, и попытался отладить его больше, поэтому мне потребовалась некоторая помощь, чтобы извлечь и отобразить его правильно.

1 Ответ

0 голосов
/ 19 октября 2018

У вас есть некоторые проблемы, вы используете FutureBuilder, но ваш метод ничего не возвращает.

Вы должны изменить это:

 Future <Null> _fetchReviews() async {

На это:

Future <List< Review >> _fetchReviews() async {

   .....

  return reviewList;
}

Future<Null> _refresh() async {
   return await _fetchReviews();
 }

Измените этот метод:

 Widget _buildReviewTiles() {

на этот:

 Widget _buildReviewTiles(List<Review> list) {

А внутри вашего FutureBuilder измените это:

  FutureBuilder(
        future: _fetchReviews(),
        builder: (context, snapshot) {
          if (snapshot.data != null) {
            return _buildReviewTiles(snapshot.data);
          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...