Показывать 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");
}

}

→ Ссылка