首先,很抱歉,如果这是一个很长的问题,因为它具有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,这可能是原因,但不确定,并尝试对其进行更多调试,因此需要一些帮助来正确地获取和显示它。
答案 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);
}