当前位置: 首页 > news >正文

网络图片的缓存和压缩

为了结合使用 CachedNetworkImageflutter_image_compress 插件,实现对网络图片的缓存和压缩,避免重复加载和减少内存占用,可以按照以下步骤进行:

1. 添加依赖

确保在 pubspec.yaml 文件中添加了以下依赖:

dependencies:flutter:sdk: fluttercached_network_image: ^3.3.0flutter_image_compress: ^1.2.0

运行以下命令以安装依赖:

flutter pub get

2. 创建自定义图片组件

创建一个自定义图片组件,结合 CachedNetworkImageflutter_image_compress 插件:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';class OptimizedCachedNetworkImage extends StatelessWidget {final String imageUrl;final int quality;final int minWidth;final int minHeight;const OptimizedCachedNetworkImage({Key? key,required this.imageUrl,this.quality = 80,this.minWidth = 1024,this.minHeight = 1024,}) : super(key: key);Future<Uint8List?> _compressImage(Uint8List imageBytes) async {try {List<int>? compressedBytes = await FlutterImageCompress.compressWithList(imageBytes,quality: quality,autoCorrectionAngle: true,minWidth: minWidth,minHeight: minHeight,);return compressedBytes != null ? Uint8List.fromList(compressedBytes) : null;} catch (e) {print("图片压缩失败:$e");return null;}}Widget build(BuildContext context) {return CachedNetworkImage(imageUrl: imageUrl,imageBuilder: (context, imageProvider) {return FutureBuilder<Uint8List?>(future: _compressImage(imageProvider.resolve(ImageConfiguration()).toString()),builder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.waiting) {return const CircularProgressIndicator();} else if (snapshot.hasError || snapshot.data == null) {return const Icon(Icons.error);}return Image.memory(snapshot.data!,fit: BoxFit.cover,);},);},placeholder: (context, url) => const CircularProgressIndicator(),errorWidget: (context, url, error) => const Icon(Icons.error),);}
}

3. 使用示例

在需要显示图片的地方使用上面创建的组件:

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('优化的网络图片加载'),),body: Center(child: OptimizedCachedNetworkImage(imageUrl: 'https://example.com/image.jpg',quality: 80,minWidth: 800,minHeight: 600,),),),);}
}

关键点说明

  • 使用 CachedNetworkImage:确保图片被缓存,避免重复的网络请求和解码。
  • 使用 flutter_image_compress:对下载的图片进行压缩,减少内存占用和提升显示效率。
  • 结合两者的优势:通过 CachedNetworkImage 避免重复加载,通过 flutter_image_compress 减少内存占用,提高应用性能。
http://www.xdnf.cn/news/589015.html

相关文章:

  • 海康相机---采集图像
  • 如何解决鸿蒙应用闪退问题
  • Flutter 3.32 新特性
  • 鸿蒙Flutter实战:21-混合开发详解-1-概述
  • flutter getx路由管理、状态管理、路由守卫中间件、永久储存get_storage
  • 汇川EasyPLC MODBUS-RTU通信配置和编程实现
  • S7-1500PLC通过工艺对象实现V90总线伺服定位控制(105报文)
  • 英伟达有意入股 PsiQuantum,释放战略转向量子计算的重要信号
  • JVM常量池(class文件常量池,运行时常量池,字符串常量池)
  • Mysql数据库之索引与事务
  • 【内部教程】ISOLAR-AB配置以太网栈|超详细实战版
  • Kotlin与Flutter:跨平台开发的互补之道与实战指南
  • Armadillo C++ 线性代数库介绍与使用
  • Kotlin 极简小抄 P10(类与对象、主构造函数、带有默认参数值的主构造函数、次要构造函数)
  • 【机器学习】集成学习算法及实现过程
  • Ubuntu20.04的安装(VMware)
  • 详解受约束的强化学习(四、数学符号说明)
  • PL/Python数据库: PostgreSQL Python扩展
  • Argo CD 详解:从 GitOps 到持续交付的完整实践
  • 关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别
  • 相机标定与图像处理涉及的核心坐标系
  • 2. PyQGIS Windows下开发环境搭建
  • Java——集合类
  • 【Android】屏幕适配小合集
  • 基于python,html,echart,php,mysql,在线实时监控入侵检测系统
  • 六一儿童节礼物清单|雷克赛恩 CyberPro1 打造亲子光影盛宴
  • OptiStruct结构分析与工程应用:结构激励
  • 线程安全问题
  • 100个Linux运维知识
  • Cursor远程连接+工具使用