无法检索api数据

时间:2018-10-19 10:03:38

标签: flutter flutter-layout

首先,很抱歉,如果这是一个很长的问题,因为它具有gist链接以及长代码块。 我想检索api数据并将其显示在listview中。 This是json结构。 This是代表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
        )
    )
    );
  }

然后this返回list tile。 这是我第一次处理api中的问题。我尝试调试后发现reviewsList的大小为0,这可能是原因,但不确定,并尝试对其进行更多调试,因此需要一些帮助来正确地获取和显示它。

1 个答案:

答案 0 :(得分:1)

您在那里遇到了一些问题,正在使用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);
          }