如何防止Flutter网络图片缓存?

8

我尝试使用以下所有的Widget从网络加载图片:

  • Image.network()
  • CachedNetworkImage()

以及它们对应的ImageProvider

  • NetworkImage
  • CachedNetworkImageProvider

没有bool可供选择不缓存图片。 我找到的唯一方法是在initState()中加载ImageProvider,然后立即调用evict()

我实际上不知道这是否有效或者这是否是最好的方法...

有没有任何方法可以“本地”防止从网络缓存?


Image.network() 不会缓存图片,每次切换到小部件时都会重新下载。 - Benyamin
从文档 https://api.flutter.dev/flutter/widgets/Image/Image.network.html : 所有网络图片都会被缓存,不管HTTP头部是什么。。我是否理解这句话有误? - Tom3652
我想你是对的。参考链接在这里 https://dev59.com/F1YN5IYBdhLWcg3wlZB7 我认为这就是你要找的答案。 - Benyamin
谢谢您提供的链接,但这是否意味着每个 ImageCache 实例都会自动清除?也就是说,每次加载 ImageProvider 时它都会从缓存中删除? - Tom3652
1
你在哪里测试?Web会自动缓存,但在Android/iOS上不会。 - Yeasin Sheikh
是的,它只适用于Android / IOS。你说得对,我有输出结果表明给定提供程序没有“挂起”缓存配置。 - Tom3652
2个回答

17
你可以通过在图像URL末尾添加?timestamp来实现。
Image.network(
   '${imgUrl}?${DateTime.now().millisecondsSinceEpoch.toString()}',
   fit: BoxFit.cover,
),

4
darn! so clever! - Ruelos Joel
2
它能够工作是因为URL是唯一的,但每个URL都会被缓存,只是你不能回退到旧的URL。我的目标是不将任何内容放入缓存中,因此我不能接受这个答案,尽管它很有用! - Tom3652

7
我刚刚创建了一个小部件,它以URL的形式获取图像,然后将其下载为Uint8List并在一个Image.memory小部件中显示。
您可以像这样使用它:
NonCacheNetworkImage('https://riverpod.dev/img/logo.png'),

import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:http/http.dart';

class NonCacheNetworkImage extends StatelessWidget {
  const NonCacheNetworkImage(this.imageUrl, {Key? key}) : super(key: key);
  final String imageUrl;
  Future<Uint8List> getImageBytes() async {
    Response response = await get(Uri.parse(imageUrl));
    return response.bodyBytes;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Uint8List>(
      future: getImageBytes(),
      builder: (context, snapshot) {
        if (snapshot.hasData) return Image.memory(snapshot.data!);
        return SizedBox(
          width: 100,
          height: 100,
          child: Text("NO DATA"),
        );
      },
    );
  }
}

你确定 Image.memory 不会缓存吗?我的意思是,我一直在使用你的方法重试,然后检查(imageCache.currentSize)和(imageCache.liveImageCount),仍然给了我一些值,需要确切地知道 Image.memory 是否不会缓存,以便能够检查其他地方的问题。 - Rageh Azzazy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接