cached_network_image_platform_interface_ce
CachedNetworkImage(社区版)的平台接口
缓存网络图片社区版 - 下载、缓存并在 Flutter 应用中显示图片。
以下为英文项目原文快照,最新内容请访问 GitHub。
cached_network_image_ce banner
pub package Listed on Flutter Gems CI status License: MIT GitHub stars GitHub Sponsors
Powered by hive_ce 8x faster cache reads Platform support
cached_network_image_ce is the actively maintained fork of
cached_network_image,
rebuilt around a caching engine that doesn't block your UI thread. Same widget and provider API you already use.
cached_network_image by Baseflow is one of the most widely used packages in the Flutter ecosystem. It has also been effectively unmaintained since August 2024, sitting on 300+ open issues, including memory leaks and scroll-performance bugs that never got fixed.
Under the hood it leans on sqflite for cache metadata: a full SQL engine routed through a platform channel just to answer "have I already downloaded this image?" On image-heavy lists, that overhead shows up as jank you can feel.
We didn't fork this just to merge dependabot PRs. We rebuilt the caching layer.
We swapped sqflite for hive_ce, a pure-Dart, non-blocking key-value store. It skips the platform channel round trip and the SQL parser entirely, so there's no jank left to fix.
vs. the original cached_network_image:
Original (cached_network_image) |
This fork (cached_network_image_ce) |
|
|---|---|---|
| Cache backend | sqflite (platform channel) | ✅ hive_ce (pure Dart) |
| Maintenance | ❌ stale since Aug 2024 | ✅ active, regular releases |
| Web caching | ⚠️ browser cache only | ✅ full persistent IndexedDB cache |
| HTTP / cache interceptors | ❌ | ✅ full chains (auth, logging, custom responses) |
| Cache eviction | ❌ fixed | ✅ pluggable — TTL or LRU |
| Cache read (10 KB) | 16 ms | ✅ 2 ms — 8x faster |
| Unsupported formats (SVG/AVIF/HEIC) | ❌ opaque decode error | ✅ unsupportedImageBuilder hook |
vs. other popular alternatives, checked live against pub.dev, so this is current rather than a guess:
| Package | Cache backend | Web support | Interceptors | Cleanup strategy | Maintenance |
|---|---|---|---|---|---|
| cached_network_image_ce (this) | hive_ce | ✅ full IndexedDB | ✅ HTTP + cache | ✅ TTL / LRU | ✅ active |
cached_network_image |
sqflite | ⚠️ browser only | ❌ | ❌ fixed | ❌ stale |
flutter_cache_manager |
sqflite / plain JSON | ✅ | ❌ | ❌ fixed | ✅ active |
extended_image |
undisclosed | ✅ | ⚠️ headers/retry only | ⚠️ manual clear | ✅ active |
fast_cached_network_image |
hive (plain) | ✅ (claimed) | ❌ | ⚠️ TTL only | ⚠️ stale (17mo) |
Worth saying plainly: flutter_cache_manager and extended_image are both actively maintained by reputable teams. They're solving different problems than we are: a generic file cache, and a broad image/gesture toolkit, respectively. The "actively maintained fork" pitch applies specifically against the original cached_network_image, which this package is a drop-in replacement for.
flowchart LR
W[CachedNetworkImage widget] --> P[CachedNetworkImageProvider]
P --> M[DefaultCacheManager]
M --> H[("Hive CE<br/>metadata: URL, path,<br/>validTill, eTag")]
M --> FS[("Native filesystem<br/>raw image bytes")]
H -.cache hit.-> P
FS -.cache hit.-> P
subgraph Original[Original package, for comparison]
direction LR
W2[CachedNetworkImage] --> M2[CacheManager]
M2 --> PC[Platform Channel]
PC --> SQL[(SQLite via sqflite)]
end
That difference is what gets you zero-jank scrolling, even in image-dense lists.
Measured cache metadata operations (check, write, delete) on an iPhone Simulator:
| Operation | Payload | Original (sqflite) |
CE (hive_ce) |
Improvement |
|---|---|---|---|---|
| Read (Hit Check) | 10 KB | 16 ms | 2 ms | 8.00x faster |
| Write (New Image) | 10 KB | 116 ms | 29 ms | 4.00x faster |
| Delete (Cleanup) | 10 KB | 55 ms | 19 ms | 2.89x faster |
| Read (Large) | 1 MB | 8 ms | 1 ms | 8.00x faster |
"Read" matters most for scroll performance, since every list item checks the cache before rendering.
Benchmark results on iPhone Simulator
Real apps shipping with cached_network_image_ce, found via a live GitHub code search for pubspec.yaml files that depend on it, sorted by stars:
| Project | Stars | What it is |
|---|---|---|
| Kazumi | stars | Rule-based anime scraper and streaming app with danmaku and real-time super-resolution. |
| PiliPlus | stars | Third-party Bilibili client built with Flutter. |
| plezy | stars | Cross-platform Plex and Jellyfin client. |
| conduit | stars | Native iOS/Android client for Open WebUI, OpenAI-compatible APIs, Ollama, and OpenRouter. |
| haka_comic | stars | Third-party, ad-free client for the PicACG (Bika/Pica) comics platform. |
| MusicPod | stars | Music, radio, TV, and podcast player for Ubuntu and macOS. |
| Fluxer | stars | Official mobile client for Fluxer. |
| jd_mall_flutter | stars | Flutter clone of a major Chinese e-commerce marketplace app. |
| BoxBox | stars | Unofficial Formula 1 and Formula E companion app. |
Shipping something with it? Open a PR and add yours, or check the full, current list yourself.
CachedNetworkImage.preCache() downloads and caches images before they hit the screen, for instant navigation.unsupportedImageBuilder instead of a bare exception.flutter pub add cached_network_image_ce
import 'package:cached_network_image_ce/cached_network_image.dart';
CachedNetworkImage(
imageUrl: 'https://example.com/image.jpg',
placeholder: (context, url) => const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
)
The quick start above covers the basics. For interceptors, cleanup strategies, connection timeouts, custom cache and metadata directories, web render modes, and unsupported-format handling, see the full reference:
cached_network_image/README.md
Q: Will I lose my users' existing cache if I migrate? A: Yes. Because we switched the storage engine from SQLite to Hive, the old cache files will be ignored. Users will re-download images once as they browse. This is a one-time migration cost for a permanent performance gain.
Q: My app crashes/pauses on errors?
A: In Debug mode, Flutter may pause on exceptions even if they are caught. This is expected behavior for network errors (404s). In Release mode, these are handled silently by the errorWidget.
Q: Why is web caching slower, or why does it use Hive for image bytes?
A: On Mobile & Desktop (IO), this package stores image bytes directly on the native file system and uses Hive only for metadata. Web lacks a native file system, so hive_ce stores both metadata and image bytes in IndexedDB there. Serializing large byte arrays in and out of IndexedDB carries overhead that doesn't exist on IO.
Alternative: if persistent caching across sessions isn't critical for your web users, consider conditionally using Image.network on web, which relies on the browser's built-in caching.
We welcome contributions! If you want to help maintain this package, check CONTRIBUTING.md.
MIT. See LICENSE for details.