无法检索 api 数据
Not able to retrieve api data
首先,如果这是一个很长的问题,很抱歉,因为它有 gist
个链接和很长的代码块。
我想检索 api 数据并将其显示在 listview
中。 This is the json structure. This是代表json的class。 Container
显示在 UI:
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
)
)
);
}
和thisreturnslist tile
。
这是我第一次在 flutter 中处理 apis。我尝试调试并了解到 reviewsList
的大小为 0,这可能是原因但我不确定,并尝试对其进行更多调试,因此需要一些帮助才能正确获取和显示它。
你有一些问题,你正在使用 FutureBuilder,但你的方法没有 return 任何东西。
你应该改变这个:
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);
}
首先,如果这是一个很长的问题,很抱歉,因为它有 gist
个链接和很长的代码块。
我想检索 api 数据并将其显示在 listview
中。 This is the json structure. This是代表json的class。 Container
显示在 UI:
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
)
)
);
}
和thisreturnslist tile
。
这是我第一次在 flutter 中处理 apis。我尝试调试并了解到 reviewsList
的大小为 0,这可能是原因但我不确定,并尝试对其进行更多调试,因此需要一些帮助才能正确获取和显示它。
你有一些问题,你正在使用 FutureBuilder,但你的方法没有 return 任何东西。
你应该改变这个:
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);
}