我正在尝试显示从http请求中获取的图片,但出现此错误“类型响应不是字符串类型的子类型”。首先,我获取最近添加的专辑列表,然后获取封面ID,并将其放入url,然后将该请求发送到api。 api发送回图像。
页:
class RecentlyAddedAlbums extends StatefulWidget {
@override
_RecentlyAddedAlbumsState createState() => _RecentlyAddedAlbumsState();
}
class _RecentlyAddedAlbumsState extends State<RecentlyAddedAlbums> {
Future<List<Album>> albums;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: FutureBuilder(
future: fetchRecentlyAddedAlbums(),
builder: (context, AsyncSnapshot<List<Album>> data) {
switch (data.connectionState) {
case ConnectionState.none:
return Text(
"none",
style: TextStyle(color: Colors.black),
);
case ConnectionState.waiting:
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.black),
));
case ConnectionState.active:
return Text('');
case ConnectionState.done:
if (data.hasData) {
List<Album> albums = data.data;
return ListView.builder(
itemCount: albums.length,
itemBuilder: (context, index) {
return FutureBuilder(
future: recentAlbumArt(albums[index].coverArt),
builder: (context, AsyncSnapshot data) {
switch (data.connectionState) {
case ConnectionState.none:
return Text(
"none",
style: TextStyle(color: Colors.black),
);
case ConnectionState.waiting:
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
Colors.black),
));
case ConnectionState.active:
return Text('');
case ConnectionState.done:
if (data.hasData) {
return Image.network(data.data);
/* return GridView.count(
padding: const EdgeInsets.all(20),
crossAxisCount: 2,
children: <Widget>[
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (context, index) {
return ListTile(
title: Image.network(
(data.data)[index]),
);
})
],
); */
}
}
});
},
);
}
}
}),
),
);
}
}
最近添加的功能:Future<List<Album>> fetchRecentlyAddedAlbums() async {
try {
var salt = randomToken(6);
var token = makeToken("$password", "$salt");
var uRL =
"$server/rest/getAlbumList?u=$username&t=$token&s=$salt&v=$tapeOutVerison&c=$client$format&type=newest";
var authresponse = await http.get(uRL);
if (authresponse.statusCode == 200) {
var jsondata = jsonDecode(authresponse.body);
var data = apicallFromJson(jsondata);
var aresponse = data.subsonicResponse.albumList.album;
return aresponse;
} else {
return null;
}
} catch (e) {
return null;
}
}
封面功能Future recentAlbumArt(String coverArtID) async {
try {
var salt = randomToken(6);
var token = makeToken("$password", "$salt");
var uRL =
"$server/rest/getCoverArt/?u=$username&t=$token&s=$salt&v=$tapeOutVerison&c=$client$format&id=$coverArtID";
return await http.get(uRL);
} catch (e) {
print(e);
}
}
专辑类别:class Album {
Album({
this.id,
this.parent,
this.isDir,
this.title,
this.album,
this.artist,
this.genre,
this.coverArt,
this.playCount,
this.created,
this.year,
});
String id;
String parent;
bool isDir;
String title;
String album;
String artist;
String genre;
String coverArt;
int playCount;
DateTime created;
int year;
最佳答案
此函数返回http响应:
return await http.get(uRL);
如果希望获取响应的内容,则需要这样获取正文:var response = await http.get(uRL);
return response.body;
关于json - Flutter Dart http Type Response不是字符串错误的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62567093/