搜索插件、代码仓与 APP 分类

插件详情v7.0.0

network_to_file_image

打开本地图像文件,如果存在的话。如果不存在,则从网络获取图像,然后保存到本地文件以供下次使用。

AndroidiOSmacOSWindowsLinux
近 30 天下载
1500
喜欢数
185
Pub 分数
140

安装插件

flutter pub add network_to_file_image

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个 Flutter 包,通过首先检查本地文件来高效管理图像加载。如果本地未找到图像,则从网络下载并保存到磁盘以供将来使用,从而减少重复下载并提升性能。非常适合需要持久化图像缓存且设置简单的应用程序。

适合场景

  • 缓存远程图像以供离线访问
  • 减少重复的网络请求
  • 通过本地存储提升应用性能
  • 显示用户个人资料图片并提供备用方案
  • 在列表视图中加载图像并保持持久性

主要特点

  • 网络获取前的本地文件检查
  • 下载后自动保存图片
  • 内置缓存机制
  • 支持多个平台
  • 简单 API 集成

适合对象

  • 需要离线图像可用性的应用
  • 图像密集型应用
  • 寻求轻量级缓存的开发者
  • 后端基础设施有限的项目
  • 针对移动和桌面平台的应用

使用建议

  • 在某些平台上需要文件系统权限
  • 磁盘空间使用量随时间增加
  • 无内置的过期或清理策略
  • 可能需要手动缓存管理
  • 对缓存大小或TTL的控制有限

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

pub package

network_to_file_image

This package combines NetworkImage and FileImage to:

  • Download the image once from the URL,
  • Save it to the local file system,
  • Use the saved image from the file system from then on.

In more detail:

Given a file and url of an image, it first tries to read it from the local file. It decodes the given File object as an image, associating it with the given scale.

However, if the image doesn't yet exist as a local file, it fetches the given URL from the network, associating it with the given scale, and then saves it to the local file. The image will be cached regardless of cache headers from the server.

Notes:
  • If the provided url is null or empty, NetworkToFileImage will default to FileImage. It will read the image from the local file, and won't try to download it from the network.

  • If the provided file is null, NetworkToFileImage will default to NetworkImage. It will download the image from the network, and won't save it locally.

Use the package

Import path_provider in your pubspec.yaml file:

path_provider: ^2.1.1 

Then use it to create a File from a file name:

Future<File> file(String filename) async {
  Directory dir = await getApplicationDocumentsDirectory();
  String pathName = p.join(dir.path, filename);
  return File(pathName);
}

var myFile = await file("myFileName.png"),

Then, create the image:

Image(image: 
   NetworkToFileImage(
      url: "https://example.com/someFile.png", 
      file: myFile,
   )
)

If you make debug: true it prints to the console whether the image was read from the file or fetched from the network:

Image(image: 
   NetworkToFileImage(
      url: "https://example.com/someFile.png", 
      file: myFile, 
      debug: true,
   )
)    

Try running the NetworkToFileImage example.

Important:

The directory where you want to save the image must already exist in the local disk. Otherwise, the image won't be saved.

Canvas

You can also load images to use with the Canvas object of the paint method of a CustomPainter.

ImageProviders can't be used directly with the Canvas object, but you can use the provided ImageForCanvas class.

For example: Suppose a User object that contains url and filename properties:

var imageForCanvas = ImageForCanvas<User>(
        imageProviderSupplier: (User user) => NetworkToFileImage(file: user.file, url: user.url),
        keySupplier: (User user) => user.filename,
        loadCallback: (image, obj, key) => setState((){}),
      );

// While the image is downloading, this will return null.
var myImage = imageForCanvas.image(user);

if (myImage != null) {
    canvas.drawImage(myImage, ...);
    }

It will use the regular image cache from Flutter, and works not only with NetworkToFileImage provider, but any other image providers.

Try running the ImageForCanvas example.

Tests

You can set mock files (local and in the network). Please see methods:

  • setMockFile(File file, Uint8List bytes)
  • setMockUrl(String url, Uint8List bytes)
  • clearMocks()
  • clearMockFiles()
  • clearMockUrls()

Your mocked urls are usually only seen by the NetworkToFileImage class. However, you may override the default Dart http methods so that these urls are visible to other ImageProviders.

To that end, simply call this method:

NetworkToFileImage.startHttpOverride();

You can stop the http override by calling:

NetworkToFileImage.stopHttpOverride();

By Marcelo Glasberg

glasberg.dev
github.com/marcglasberg
linkedin.com/in/marcglasberg/
twitter.com/glasbergmarcelo
stackoverflow.com/users/3411681/marcg
medium.com/@marcglasberg

My article in the official Flutter documentation:

The Flutter packages I've authored:

My Medium Articles:

所属分类

源码仓库

使用此插件的项目

暂无相关数据。