Flutter图片缓存插件cached_s5_image的使用

Flutter图片缓存插件cached_s5_image的使用

cached_s5_image

一个用于S5 CID的简单缓存图像提供器。

演示GIF

使用

查看示例

这是一个基于s5库构建的库。更多详细信息请参阅s5

基本用法:

Widget cachedS5Image = CachedS5Image(
  cid: cid, // 字符串
  s5: s5, // 参见 https://pub.dev/packages/s5
  thumbhash: thumbhashText, // thumbhash的字符串表示
);

感谢

这项工作得到了Sia基金会的支持。

完整示例代码

import 'package:cached_s5_image/cached_s5_image.dart';
import 'package:cached_s5_image_example/src/s5.dart';
import 'package:cached_s5_manager/cached_s5_manager.dart';
import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'package:s5/s5.dart';

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

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

  // 这是你的应用的根组件。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: '缓存S5图像演示',
      home: Demo(),
    );
  }
}

class Demo extends StatefulWidget {
  const Demo({super.key});
  [@override](/user/override)
  State<Demo> createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  String? cid;
  final TextEditingController _cidController = TextEditingController(
      text: "z2H7AJ1Pt8FdqG5UNzt4ffEhMY28c2z3K13TGf9fGcCRRwN7kS5B");
  final TextEditingController _thumhashController =
      TextEditingController(text: "mtcJLYbGWGaPeYiLl4dndYaAdgdY");
  S5? s5;
  Logger logger = Logger();
  CachedS5Manager? cacheManager;

  [@override](/user/override)
  void initState() {
    _initS5();

    super.initState();
  }

  Future<void> _initCache() async {
    await cacheManager?.init();
  }

  void _initS5() async {
    // 这是一个示例S5节点,建议使用自己的节点以获得最佳性能
    s5 = await initS5("https://s5.jptr.tech", "hive", null);
    cacheManager = CachedS5Manager(s5: s5!);
    await _initCache();
    setState(() {}); // 更新UI
  }

  void _submitCID() async {
    if (s5 != null) {
      setState(() {
        cid = _cidController.text;
      });
    }
  }

  void _clearCache() async {
    cacheManager?.clear();
  }

  void _clearImage() async {
    setState(() {
      cid = null;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          Row(
            children: [
              const Text("S5状态:"),
              (s5 == null)
                  ? const CircularProgressIndicator()
                  : const Icon(Icons.check),
            ],
          ),
          TextField(
            controller: _cidController,
            decoration: const InputDecoration(labelText: "CID: z2..."),
          ),
          const SizedBox(
            height: 10,
          ),
          TextField(
            controller: _thumhashController,
            decoration: const InputDecoration(labelText: "Thumbhash: "),
          ),
          const SizedBox(
            height: 10,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                  onPressed: _submitCID, child: const Text("提交CID")),
              ElevatedButton(
                  onPressed: _clearCache, child: const Text("清除缓存")),
              ElevatedButton(
                  onPressed: _clearImage,
                  child: const Text("清除加载的图像"))
            ],
          ),
          const SizedBox(
            height: 10,
          ),
          AnimatedSwitcher(
            duration: const Duration(milliseconds: 300),
            child: (cid != null && s5 != null)
                ? CachedS5Image(
                    cid: cid!,
                    s5: s5!,
                    thumbhash: _thumhashController.text,
                    cacheManager: cacheManager,
                  )
                : Container(),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter图片缓存插件cached_s5_image的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


cached_network_image 是 Flutter 中一个非常流行的插件,用于加载和缓存网络图片。它可以帮助你高效地加载网络图片,并且自动处理图片的缓存,避免重复下载相同的图片。

以下是如何在 Flutter 项目中使用 cached_network_image 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  cached_network_image: ^3.2.0

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

2. 基本用法

你可以使用 CachedNetworkImage 组件来加载网络图片。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('CachedNetworkImage Example'),
        ),
        body: Center(
          child: CachedNetworkImage(
            imageUrl: 'https://example.com/image.jpg',
            placeholder: (context, url) => CircularProgressIndicator(),
            errorWidget: (context, url, error) => Icon(Icons.error),
          ),
        ),
      ),
    );
  }
}

3. 参数说明

  • imageUrl: 要加载的图片的 URL。
  • placeholder: 在图片加载过程中显示的占位符。通常是一个加载指示器(如 CircularProgressIndicator)。
  • errorWidget: 如果图片加载失败时显示的组件,通常是一个错误图标。
  • fit: 图片的填充方式,例如 BoxFit.coverBoxFit.contain 等。
  • widthheight: 图片的宽度和高度。
  • fadeInDuration: 图片淡入的持续时间。
  • fadeInCurve: 图片淡入的动画曲线。

4. 高级用法

缓存管理

你可以使用 CachedNetworkImageProvider 来手动管理图片缓存:

final imageProvider = CachedNetworkImageProvider('https://example.com/image.jpg');

清除缓存

你可以使用 CachedNetworkImage.evictFromCache 方法来清除缓存中的特定图片:

CachedNetworkImage.evictFromCache('https://example.com/image.jpg');

自定义缓存配置

你可以在 CachedNetworkImage 初始化时配置缓存的大小和过期时间:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  maxWidthDiskCache: 1000, // 最大磁盘缓存宽度
  maxHeightDiskCache: 1000, // 最大磁盘缓存高度
  cacheKey: 'custom_cache_key', // 自定义缓存键
);

5. 完整示例

以下是一个完整的示例,展示了如何使用 CachedNetworkImage 加载和显示网络图片:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('CachedNetworkImage Example'),
        ),
        body: Center(
          child: CachedNetworkImage(
            imageUrl: 'https://example.com/image.jpg',
            placeholder: (context, url) => CircularProgressIndicator(),
            errorWidget: (context, url, error) => Icon(Icons.error),
            fit: BoxFit.cover,
            width: 200,
            height: 200,
          ),
        ),
      ),
    );
  }
}
回到顶部