如何防止缓存图片受到网络抖动的影响?

Tom*_*652 9 dart flutter flutter-image

我已尝试以下所有方法Widget从网络加载图像:

  • Image.network()
  • CachedNetworkImage()

还有他们的ImageProvider

  • NetworkImage
  • CachedNetworkImageProvider

无法bool选择不缓存图像。我发现的唯一方法是加载ImageProvider类似的内容initState(),然后evict()立即调用。

我真的不知道这是否真的有效,或者这是否是最好的方法......

有什么方法可以阻止“本地”网络缓存吗?

luk*_*uke 18

您只需在图像网址末尾添加?后即可实现此目的。timestamp

Image.network(
   '${imgUrl}?${DateTime.now().millisecondsSinceEpoch.toString()}',
   fit: BoxFit.cover,
),
Run Code Online (Sandbox Code Playgroud)

  • 该死!好聪明! (5认同)
  • 它之所以有效,是因为 URL 是唯一的,但无论如何每个 url 都会被缓存,你只是不能依赖于旧的 URL。我的目标是不将任何内容放入缓存中,因此我无法接受这个答案,尽管它很有用! (2认同)

Saj*_*ahi 7

我刚刚创建了一个小部件,它将图像作为 URL 获取,然后将其下载Uint8List并在小部件中显示Image.memory

你可以这样使用它:

NonCacheNetworkImage('https://riverpod.dev/img/logo.png'),
Run Code Online (Sandbox Code Playgroud)
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"),
        );
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)