如何在颤振中缓存来自 firebase 的图像?

时间:2021-02-18 13:47:06

标签: flutter caching firebase-storage

我一直在尝试在我的 Flutter 应用程序中做一个缓存管理系统。理想情况下,我想从 firebase 存储中检索图像并将它们与其他详细信息一起显示。我从 firestore 检索快照并使用 cachednetworkimage 来显示图像。但是我显示的图像数量很多,导致我的应用程序崩溃。我相信如果我在本地缓存图像,这个问题就会解决。除此之外,我还想缓存 json 文件,以便在离线模式下,我的应用程序将显示缓存的图像和缓存中可用的其他详细信息。

我想显示帖子,其中包含用户名、用户个人资料图片、图片帖子本身、标题和评论。所以我检索帖子的方式是根据以下...

void fetchFeed() async {
auth.User currentUser = await _repository.getCurrentUser();

User user = await _repository.fetchUserDetailsById(currentUser.uid);
setState(() {
  this.currentUser = user;
});
setState(() {
  loadingPosts = true;
});
Query query =  _firestore.collection("users").doc(user.uid).collection("following").orderBy("uid").limit(perPage);
QuerySnapshot querySnapshot = await query.get();
for (var i = 0; i < querySnapshot.docs.length; i++) {
  followingUIDs.add(querySnapshot.docs[i].id);
}

for (var i = 0; i < followingUIDs.length; i++) {
  Query posts = _firestore.collection("users").doc(followingUIDs[i]).collection("posts").orderBy("time").limit(perUser);
  QuerySnapshot postSnapshot = await posts.get();
  lastPost = postSnapshot.docs[postSnapshot.docs.length -1];
  for (var i = 0; i < postSnapshot.docs.length; i++) {
    feedlist.add(postSnapshot.docs[i]);
  }
}
setState(() {
  loadingPosts = false;
});

}

在我检索帖子后,我将它们放在列表视图中并按顺序显示。我遇到的问题是,由于图像未在本地缓存,因此我使用缓存的网络图像小部件来显示它们。每当我导航到另一个页面并返回时,所有缓存的网络图像都会重新加载,这会给应用带来很大的负载,从而导致它崩溃。

 CachedNetworkImage(
          imageUrl: list[index].data()['imgUrl'],
          placeholder: ((context, url) => Container(
              width: MediaQuery.of(context).size.width,
              height: MediaQuery.of(context).size.width,
              decoration: BoxDecoration(
                image: DecorationImage(
                    image: AssetImage('assets/Black.png'),
                    fit: BoxFit.cover),
              ))),
          fit: BoxFit.fitWidth,
        ),

或者,我尝试使用以下功能下载图像并将其保存在本地。我为从 firebase 检索到的每个图像项调用该函数。但这只是出于某种原因扭曲了图像。

Future <Null> downloadFile(String httpPath) async{
  final StorageReference ref = await FirebaseStorage.instance.getReferenceFromUrl(httpPath);
  final StorageFileDownloadTask downloadTask = ref.writeToFile(file);

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

  print(byteNumber);

  setState(() => _cachedFile = file);

}

http 路径是我为每个图像获得的下载 url。但我不确定这是否是下载图像的最佳方式。由于我无法知道 firebase 存储中出现的图像文件名,因此这是我唯一的选择。

有人可以告诉我下载和缓存图像的替代方法,以及 json 文件(包含用户名、评论、标题),以便我可以离线显示它们?

1 个答案:

答案 0 :(得分:0)

为此使用 cached_network_image 包。它还支持占位符和加载时淡入的图像。

CachedNetworkImage( imageUrl: 'https://picsum.photos/250?image=9');

完整示例

`

return MaterialApp(
  title: title,
  home: Scaffold(
    appBar: AppBar(
      title: Text(title),
    ),
    body: Center(
      child: CachedNetworkImage(
        placeholder: (context, url) => CircularProgressIndicator(),
        imageUrl:
            'https://picsum.photos/250?image=9',
      ),
    ),
  ),
);

`