网络图片的缓存和压缩

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

1. 添加依赖

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

yaml 复制代码
dependencies:
  flutter:
    sdk: flutter
  cached_network_image: ^3.3.0
  flutter_image_compress: ^1.2.0

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

bash 复制代码
flutter pub get

2. 创建自定义图片组件

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

dart 复制代码
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;
    }
  }

  @override
  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. 使用示例

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

dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  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 减少内存占用,提高应用性能。
相关推荐
2601_9498477515 小时前
Form-data 跨端三方库仓颉适配全流程
前端·javascript·flutter
大龄秃头程序员18 小时前
Flutter 中我为什么把 GetX 定位为高效率方案,而不是默认架构方案
flutter
传奇开心果编程20 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
2501_944521591 天前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
大龄秃头程序员2 天前
Flutter 架构里总被混淆的 IoC、DI、Service Locator,到底是什么关系?
flutter
事圆则缓2 天前
Flutter 与原生交互的最后一层:RTC 视频帧怎么走
flutter·音视频·实时音视频
2601_949847752 天前
jose 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_949970692 天前
msgpackr 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_949970692 天前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
传奇开心果编程2 天前
【Flutter踩坑排雷】第3课:const 误用坑|const 错误使用引发 UI 异常与性能损耗
flutter·移动开发·跨平台·dart·编程语言理论·编程框架·声明式ui