You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用cached_network_image将网络图片长期缓存到SharedPreference中

技术上可以实现,但强烈不推荐该方案

SharedPreference 本身的设计定位是存储字符串、布尔值、数字这类轻量级配置数据,单条数据建议不超过100KB。而图片文件大小通常在数百KB到数MB不等,将图片转码后存入SharedPreference,会大幅拖慢配置项的读写速度,严重时甚至会引发应用卡顿、ANR异常。

如果确实需要临时用该方案实现需求,可以按以下步骤操作:

  • 第一步:将网络图片转码为Base64字符串
    先下载图片的二进制字节流,再通过Base64编码将字节流转为纯文本格式,即可存入SharedPreference,Dart示例代码如下:
    import 'dart:convert';
    import 'package:shared_preferences/shared_preferences.dart';
    import 'package:http/http.dart' as http;
    
    Future<void> saveImageToSp(String imageUrl, String cacheKey) async {
      final response = await http.get(Uri.parse(imageUrl));
      if (response.statusCode == 200) {
        String base64Content = base64Encode(response.bodyBytes);
        final spInstance = await SharedPreferences.getInstance();
        await spInstance.setString(cacheKey, base64Content);
      }
    }
    
  • 第二步:从SharedPreference读取并展示图片
    取出存储的Base64字符串后,解码为字节流即可直接交给Image组件渲染:
    Future<Image?> getCachedImageFromSp(String cacheKey) async {
      final spInstance = await SharedPreferences.getInstance();
      String? base64Content = spInstance.getString(cacheKey);
      if (base64Content == null) return null;
      Uint8List imageBytes = base64Decode(base64Content);
      return Image.memory(imageBytes);
    }
    

更合理的长期缓存方案

你不需要额外将图片存入SharedPreference,直接修改cached_network_image的缓存配置即可实现长期离线可用:

  • 自定义缓存有效期,可设置为1年甚至更久,同时调整最大缓存容量上限,满足你的长期存储需求
  • 如果你需要更灵活的控制逻辑,也可以直接将图片文件存入应用私有文档目录,仅在SharedPreference中存储图片的本地路径即可,该方案的读写性能比存储Base64字符串高数十倍。

内容的提问来源于stack exchange,提问作者Muhammad Tameem Rafay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:57:02