Flutter网络图片缓存与加载插件rxcache_network_image的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter网络图片缓存与加载插件rxcache_network_image的使用

rxcache_network_image 是一个用于Flutter应用中高效加载和缓存网络图片的插件。它支持磁盘缓存和内存缓存,并且允许预加载图片以提高用户体验。

主要特性

  • 磁盘缓存图片
  • 内存缓存图片
  • 使用 RxCacheManager 预加载图片

开始使用

首先,在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  rxcache_network_image: 1.0.7

然后运行 flutter pub get 来安装这个包。

基本用法

显示缓存的网络图片

你可以使用 RxImage.cacheNetwork 小部件来显示缓存的网络图片:

RxImage.cacheNetwork(
  url: 'https://example.com/image.png',
);

设置内存缓存大小

你可以通过 setMemoryCache 方法设置内存缓存的大小:

cacheManager.setMemoryCache(size); // size in bytes

下载图片

使用 download 方法下载并缓存图片:

cacheManager.download(url: 'https://example.com/image.png');

获取缓存文件

使用 getFile 方法获取缓存的文件:

final file = await cacheManager.getFile('https://example.com/image.png');

创建自定义 CacheManager

你可以创建自己的 CacheManager 类,以便根据需要进行定制:

class CustomCacheManager extends BaseRxCacheManager {
  static CustomCacheManager? _instance;

  CustomCacheManager._({String folder = "rx_image_cache"}) : super(folder: folder);

  factory CustomCacheManager({String folder = "rx_image_cache"}) {
    _instance ??= CustomCacheManager._(folder: folder);
    return _instance!;
  }
}

示例代码

以下是一个完整的示例,展示了如何在Flutter应用中使用 rxcache_network_image 插件:

import 'package:flutter/material.dart';
import 'package:rxcache_network_image/rxcache_network_image.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final cacheManager = RxCacheManager();
  final showList = ValueNotifier(true);
  bool allowLoad = true;
  final items = [
    "https://images.pexels.com/photos/18280488/pexels-photo-18280488.jpeg?auto=compress&cs=tinysrgb&w=1200&lazy=load",
    "https://images.pexels.com/photos/19564349/pexels-photo-19564349.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  ];

  [@override](/user/override)
  void didChangeDependencies() async {
    for (var element in urls) {
      cacheManager.download(url: element);
    }
    super.didChangeDependencies();
  }

  [@override](/user/override)
  void dispose() {
    showList.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          const SizedBox(height: 30),
          SizedBox(
            height: 600,
            width: double.infinity,
            child: ValueListenableBuilder(
              valueListenable: showList,
              builder: (context, value, child) {
                return value
                    ? NotificationListener<ScrollNotification>(
                        onNotification: (details) {
                          if (details.metrics.pixels == details.metrics.maxScrollExtent) {
                            if (allowLoad) {
                              loadMore();
                            }
                          }
                          return true;
                        },
                        child: ListView.builder(
                          itemCount: items.length,
                          itemBuilder: (context, index) {
                            return RxImage.cacheNetwork(
                              url: items[index],
                              width: double.infinity,
                              fit: BoxFit.cover,
                              height: 300,
                            );
                          },
                        ),
                      )
                    : const SizedBox.shrink();
              },
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton.small(onPressed: () {
        showList.value = !showList.value;
      }),
    );
  }

  void loadMore() async {
    allowLoad = false;
    await Future.delayed(const Duration(milliseconds: 750), () {
      debugPrint("wait preload");
    });

    for (final url in urls) {
      cacheManager.download(url: url);
    }

    setState(() {
      items.addAll(urls);
    });
  }
}

const urls = [
  "https://images.pexels.com/photos/19560944/pexels-photo-19560944.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  "https://images.pexels.com/photos/17889085/pexels-photo-17889085.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  "https://images.pexels.com/photos/19542480/pexels-photo-19542480.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  // 更多URL...
];

更多关于Flutter网络图片缓存与加载插件rxcache_network_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络图片缓存与加载插件rxcache_network_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,使用rxcache_network_image插件可以高效地实现网络图片的缓存与加载。下面是一个详细的代码示例,展示如何集成并使用rxcache_network_image

步骤 1: 添加依赖

首先,在pubspec.yaml文件中添加rxcache_network_image依赖:

dependencies:
  flutter:
    sdk: flutter
  rxcache_network_image: ^最新版本号  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

步骤 2: 导入包

在你的Dart文件中导入rxcache_network_image包:

import 'package:rxcache_network_image/rxcache_network_image.dart';

步骤 3: 使用RxCacheNetworkImage

下面是一个完整的示例,展示如何在Flutter应用中使用RxCacheNetworkImage来加载和缓存网络图片。

import 'package:flutter/material.dart';
import 'package:rxcache_network_image/rxcache_network_image.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String imageUrl = 'https://example.com/path/to/your/image.jpg';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('RxCacheNetworkImage Demo'),
      ),
      body: Center(
        child: RxCacheNetworkImage(
          imageUrl,
          placeholder: (context, url) => CircularProgressIndicator(),
          errorWidget: (context, url, error) => Icon(Icons.error),
          cacheConfig: CacheConfig(
            maxAge: const Duration(days: 7), // 缓存有效期
            maxCount: 100, // 最大缓存数量
          ),
          headers: {
            'Authorization': 'Bearer YOUR_ACCESS_TOKEN', // 如果有需要添加的头信息
          },
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:确保在pubspec.yaml文件中添加了rxcache_network_image依赖。
  2. 导入包:在Dart文件中导入rxcache_network_image
  3. 使用RxCacheNetworkImage
    • imageUrl:要加载的图片的URL。
    • placeholder:在图片加载时显示的占位符,这里使用了一个CircularProgressIndicator
    • errorWidget:在图片加载失败时显示的错误组件,这里使用了一个错误图标。
    • cacheConfig:配置缓存策略,包括缓存的最大有效期和最大缓存数量。
    • headers:如果需要添加额外的HTTP头信息,可以在这里指定,例如用于身份验证的Bearer令牌。

通过上述步骤,你可以在Flutter应用中高效地加载和缓存网络图片。rxcache_network_image插件会自动处理图片的缓存逻辑,减少不必要的网络请求,提升用户体验。

回到顶部