Показывать svg или изображение из сети в зависимости от типа flutter
Я делаю месенджер и для отображение аватаров пользователей с бека приходит или установленное пользователем изображение или дефолтное svg.
Я пытался реализовать функцию проверки для отображение png, jpeg или svg
httpGetLogoImage () async {
try {
HttpClientRequest request = await HttpClient().getUrl(Uri.parse( "https://api.test.im/${chat['logo']}"));
HttpClientResponse response = await request.close();
File file = File('foo');
var fileImage = await response.pipe(file.openWrite());
img.PngDecoder png = img.PngDecoder();
img.JpegDecoder jpg = img.JpegDecoder();
if(png.isValidFile(fileImage) || jpg.isValidFile(fileImage)) {
return Image.file(fileImage);
} else {
return SvgPicture.file(fileImage);
}
} catch (error) {
print("Error $error");
}
Так как это асинхронная функция необходимо подождать получение данных ну и отображать лоудер я реализовал это через
FutureBuilder(
future: httpGetLogoImage,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if(snapshot.hasData)
return Container (
padding:
EdgeInsets.zero,
height: 150,
width: 150,
child: snapshot.data,
);
return Container(child: CircularProgressIndicator());
},
),
Но у меня выходит ошибка The argument type 'dynamic Function()' can't be assigned to the parameter type 'Future?'.
Ответы (1 шт):
Автор решения: Silverfire
→ Ссылка
Когда нибудь я разберусь как работать с файловой системой, пока я реализовал это следующим образом
httpGetLogoImage () {
try {
if(chat['logo'].endsWith('.svg')) {
//Отображение svg картинки
return SvgPicture.network(
"https://api.test.im/${chat['logo']}",
semanticsLabel: 'A shark?!',
placeholderBuilder: (BuildContext context) => Container(
padding: const EdgeInsets.all(30.0),
child: const CircularProgressIndicator()),
);
} else {
return CircleAvatar(
radius: 30.0,
backgroundImage:
NetworkImage("https://api.test.im/${chat['logo']}"),
backgroundColor: Colors.transparent,
);
}
} catch (error) {
print("Error $error");
}
}