我试图让AngularDart教程发挥作用。我已经更改了类的名称,并且正在调用真正的服务器。数据没有回到列表中。我怀疑问题出现在这段代码中:
final artists = _extractData(response)
.map((value) => new Artist.fromJson(value))
.toList();
我想将其分解为单独的声明,但我无法在Internet搜索中找到对.map的任何引用。它不是地图集合上的方法。怎么会分开呢?
完整的方法是:
Future<List<Artist>> getArtists() async {
await HttpRequest.request(_artistsUrl, requestHeaders: headers).then((response) {
final artists = _extractData(response)
.map((value) => new Artist.fromJson(value))
.toList();
return artists;
});
}
调用的方法是:
dynamic _extractData(HttpRequest req) {
Map data = JSON.decode(req.responseText);
return data;
}
和
factory Artist.fromJson(Map<String, dynamic> artist) =>
new Artist(_toInt(artist['id']),
artist['first_name'],
artist['last_name'],
artist['notes'],
artist['primary_instrument'],
artist['other_instruments'],
artist['birth_year'],
artist['death_year']
);
getArtists的来电者是:
class DashboardComponent implements OnInit {
List<Artist> artists;
final ArtistService _artistService;
final Router _router;
DashboardComponent(this._artistService, this._router);
Future<Null> ngOnInit() async {
artists = (await _artistService.getArtists());
print("Dashboard Length: ${artists.length}"); // this crashes
}
}
我重写了艺术家:
Future<List<Artist>> getArtists() async {
HttpRequest response = await HttpRequest.request(url, requestHeaders: headers);
List data = JSON.decode(response.responseText);
final artists = data
.map((value) => new Artist.fromJson(value))
.toList();
return artists;
}
我汇总了extractData方法。真正的问题在于&#34;返回艺术家&#34;在内部代码块中。结果,它没有返回给getArtists的调用者。 this question也涉及到这个问题,这使得这个问题有点多余。
答案 0 :(得分:3)
我认为问题是_extractData()
应该返回List<Map>
,其中每个项目都是序列化Artist
List
也有map()
方法。
dynamic _extractData(HttpRequest req) {
List data = JSON.decode(req.responseText);
return data;
}
会使此代码正常工作
final artists = _extractData(response)
.map((value) => new Artist.fromJson(value))
.toList();
但这取决于response
的实际情况。
答案 1 :(得分:1)
问题是您正在使用.then
Future返回的HttpRequest.request
,并且异步调用其回调参数。所以未来已经完成,但结果列表尚未填写。 await
是.then
的简写,尝试保存await HttpRequest.request
对变量的响应并将回调移到其后面。