我必须从Firebase下载图像以显示它吗?

时间:2018-07-27 07:21:26

标签: firebase flutter firebase-storage

我正在使用Flutter和Firebase。我设法使用以下方案将用户个人资料照片上传到Firebase存储:

users / userid.png

到目前为止,每当我需要显示用户个人资料图像时,都必须先将其下载到本地。像

final String fileName = uid + ".png";

Directory appDocDir = await getTemporaryDirectory();

String appDocPath = appDocDir.path;
final File file = File('$appDocPath/$fileName');
// clears the file
file.writeAsStringSync("");
final StorageReference ref = FirebaseStorage.instance.ref().child('users/' + fileName);

final StorageFileDownloadTask downloadTask = ref.writeToFile(file);

final int byteNumber = (await downloadTask.future).totalByteCount;

print("byteNumber : ${byteNumber}");
    } catch(e) {
      return null;
    }

但是,我想知道是否可以跳过该步骤,而仅使用NetworkImage()函数,例如:

final StorageReference ref = FirebaseStorage.instance.ref().child('users/' + user.uid + ".png");
String downloadURL = await ref.getDownloadURL();

downloadURL = Uri.decodeFull(downloadURL.toString());
print("FB Storage URL: $downloadURL");


return new NetworkImage(downloadURL);

它不起作用并引发异常。

我想做的事;有可能吗?

2 个答案:

答案 0 :(得分:1)

始终必须将要显示的图像数据读入要在其中显示的应用程序中。但是,您不必像现在这样自行处理下载。

Firebase Storage中的任何文件都有一个所谓的下载URL。拥有此URL的任何人都可以读取文件,而无需使用Firebase Storage SDK。这几乎是来自互联网的大多数图像的方式,因此有很多库可以处理这样的图像URL。

例如Flutter cookbook has a section on displaying images from the internet,它显示Image小部件可以显示来自URL的图像,如下所示:

Image.network(
  'https://raw.githubusercontent.com/flutter/website/master/_includes/code/layout/lakes/images/lake.jpg',
)

在使用Github中的图片的情况下,您还可以使用Firebase Storage中的下载URL。

大多数应用程序在上传文件时会将文件的下载URL存储在其数据库中。如果您没有下载URL,而只有路径,则可以通过以下方式获取下载URL:

final StorageReference ref = FirebaseStorage.instance.ref().child('users/' + fileName);
final Uri downloadUrl = await ref.getDownloadUrl();

我不是Flutter专家,所以该代码段中可能存在一些问题。

答案 1 :(得分:0)

好的,我发现我遇到了错误。 我将URI转换为String并在NetworkImage中使用它。 当我从URI中删除.ToString()时,它会起作用。