Flutter图片优化缓存插件optimized_cached_image的使用

Flutter图片优化缓存插件optimized_cached_image的使用

optimized_cached_image 是一个用于从网络加载图片并根据容器约束调整大小和缓存的Flutter库。该库旨在提高内存敏感性,通过将图像调整为较小的尺寸后存储在缓存中。它受到了 cached_network_image 库的启发。

此库提供了两个类来加载图像:

  • OptimizedCacheImage,它是 CachedNetworkImage 的一对一映射。
  • OptimizedCacheImageProvider,它是 CachedNetworkImageProvider 的映射。

如何使用

OptimizedCacheImage 可以直接使用,也可以通过 ImageProvider 使用。OptimizedCacheImageOptimizedCacheImageProvider 都对Web支持有限,目前不包括缓存功能。

带占位符的用法
OptimizedCacheImage(
  imageUrl: "http://via.placeholder.com/350x150",
  placeholder: (context, url) => CircularProgressIndicator(),
  errorWidget: (context, url, error) => Icon(Icons.error),
)
带进度指示器的用法
OptimizedCacheImage(
  imageUrl: "http://via.placeholder.com/350x150",
  progressIndicatorBuilder: (context, url, downloadProgress) =>
      CircularProgressIndicator(value: downloadProgress.progress),
  errorWidget: (context, url, error) => Icon(Icons.error),
)
直接使用ImageProvider
Image(image: OptimizedCacheImageProvider(url))
同时使用占位符和ImageProvider
OptimizedCacheImage(
  imageUrl: "http://via.placeholder.com/200x150",
  imageBuilder: (context, imageProvider) => Container(
    decoration: BoxDecoration(
      image: DecorationImage(
          image: imageProvider,
          fit: BoxFit.cover,
          colorFilter:
              ColorFilter.mode(Colors.red, BlendMode.colorBurn)),
    ),
  ),
  placeholder: (context, url) => CircularProgressIndicator(),
  errorWidget: (context, url, error) => Icon(Icons.error),
)

处理GIF

optimized_cached_image 使用 flutter_image_compress 作为压缩库。虽然这个库在内存效率方面表现良好,但它不直接支持GIF格式。不过,从版本 2.0.2-alpha 开始,所有GIF都会被压缩为WebP格式。

它是如何工作的

optimized_cached_image 通过 flutter_cache_manager 存储和检索文件。

FAQ

我的应用在图像加载失败时崩溃了。(我知道这并不是一个问题。)

是否真的崩溃了?调试器可能会暂停,因为Dart VM无法识别为捕获异常;控制台可能会打印错误;即使你的崩溃报告工具也可能报告它(我知道这真的很糟糕)。然而,应用真的崩溃了吗?可能一切都在正常运行。如果你确实遇到应用崩溃的情况,可以报告问题,但请提供一个小示例以便我们能够重现崩溃。

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 optimized_cached_image 插件。

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

import 'template/globals.dart';

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

/// A Flutter application demonstrating the functionality of this plugin
class HumblerookiePluginExample extends StatelessWidget {
  /// [MaterialColor] to be used in the app [ThemeData]
  final MaterialColor themeMaterialColor =
      createMaterialColor(const Color.fromRGBO(48, 49, 60, 1));

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Humblerookie $pluginName',
      theme: ThemeData(
        accentColor: Colors.white60,
        backgroundColor: const Color.fromRGBO(48, 49, 60, 0.8),
        buttonTheme: ButtonThemeData(
          buttonColor: themeMaterialColor.shade500,
          disabledColor: themeMaterialColor.withRed(200),
          splashColor: themeMaterialColor.shade50,
          textTheme: ButtonTextTheme.primary,
        ),
        bottomAppBarColor: const Color.fromRGBO(57, 58, 71, 1),
        hintColor: themeMaterialColor.shade500,
        primarySwatch: createMaterialColor(const Color.fromRGBO(48, 49, 60, 1)),
        textTheme: TextTheme(
          bodyText1: TextStyle(
            color: Colors.white,
            fontSize: 16,
            height: 1.3,
          ),
          bodyText2: TextStyle(
            color: Colors.white,
            fontSize: 18,
            height: 1.2,
          ),
          button: TextStyle(color: Colors.white),
          headline1: TextStyle(
            color: Colors.white,
            fontSize: 18,
          ),
        ),
        visualDensity: VisualDensity.adaptivePlatformDensity,
        inputDecorationTheme: const InputDecorationTheme(
          fillColor: Color.fromRGBO(37, 37, 37, 1),
          filled: true,
        ),
      ),
      home: AppHome(title: 'Baseflow $pluginName example app'),
    );
  }

  /// Creates a [MaterialColor] based on the supplied [Color]
  static MaterialColor createMaterialColor(Color color) {
    List strengths = <double>[.05];
    Map<int, Color> swatch = {};
    final r = color.red, g = color.green, b = color.blue;

    for (var i = 1; i < 10; i++) {
      strengths.add(0.1 * i);
    }
    for (var strength in strengths) {
      final ds = 0.5 - strength;
      swatch[(strength * 1000).round()] = Color.fromRGBO(
        r + ((ds < 0 ? r : (255 - r)) * ds).round(),
        g + ((ds < 0 ? g : (255 - g)) * ds).round(),
        b + ((ds < 0 ? b : (255 - b)) * ds).round(),
        1,
      );
    }
    return MaterialColor(color.value, swatch as Map<int, Color>);
  }
}

/// A Flutter example demonstrating how the [pluginName] plugin could be used
class AppHome extends StatefulWidget {
  /// Constructs the [AppHome] class
  AppHome({Key? key, this.title}) : super(key: key);

  /// The [title] of the application, which is shown in the application's
  /// title bar.
  final String? title;

  [@override](/user/override)
  _AppHomeState createState() => _AppHomeState();
}

class _AppHomeState extends State<AppHome> {
  static final PageController _pageController = PageController(initialPage: 0);
  int _currentPage = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).bottomAppBarColor,
        title: Center(
          child: Text("OptimizedCachedImage"),
        ),
      ),
      backgroundColor: Theme.of(context).backgroundColor,
      body: PageView(
        controller: _pageController,
        children: pages,
        onPageChanged: (page) {
          setState(() {
            _currentPage = page;
          });
        },
      ),
      bottomNavigationBar: _bottomAppBar(),
    );
  }

  BottomAppBar _bottomAppBar() {
    return BottomAppBar(
      elevation: 5,
      color: Theme.of(context).bottomAppBarColor,
      child: Row(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: List.unmodifiable(() sync* {
          for (var i = 0; i < pages.length; i++) {
            yield Expanded(
              child: IconButton(
                iconSize: 30,
                icon: Icon(icons.elementAt(i)),
                color: _bottomAppBarIconColor(i),
                onPressed: () => _animateToPage(i),
              ),
            );
          }
        }()),
      ),
    );
  }

  void _animateToPage(int page) {
    _pageController.animateToPage(page,
        duration: const Duration(milliseconds: 200), curve: Curves.linear);
  }

  Color _bottomAppBarIconColor(int page) {
    return _currentPage == page ? Colors.white : Theme.of(context).accentColor;
  }
}

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

1 回复

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


当然,optimized_cached_image 是一个用于 Flutter 的强大图片缓存和优化插件。它结合了图片加载、缓存管理以及内存优化功能,能够显著提升应用性能和用户体验。以下是如何在 Flutter 项目中使用 optimized_cached_image 的一个示例代码案例。

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

dependencies:
  flutter:
    sdk: flutter
  optimized_cached_image: ^x.y.z  # 请将 x.y.z 替换为最新版本号

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

接下来,你可以在你的 Flutter 应用中使用 OptimizedCachedImage 小部件。以下是一个简单的示例:

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

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

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

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Optimized Cached Image Demo'),
      ),
      body: Center(
        child: OptimizedCachedImage(
          imageUrl: imageUrl,
          placeholder: (context, url) => CircularProgressIndicator(),
          errorWidget: (context, url, error) => Icon(Icons.error),
          fit: BoxFit.cover,
          width: double.infinity,
          height: 300,
          cacheConfig: CacheConfig(
            maxAge: const Duration(days: 7),
            maxCacheObjects: 100,
            repo: ImageCacheRepository.memory, // 或者使用 ImageCacheRepository.disk
          ),
          progressIndicatorBuilder: (context, url, downloadProgress) {
            return LinearProgressIndicator(
              value: downloadProgress.progress,
            );
          },
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖导入:首先导入 optimized_cached_image 包。
  2. OptimizedCachedImage 小部件
    • imageUrl:图片的 URL。
    • placeholder:在图片加载过程中显示的占位符。这里使用了一个 CircularProgressIndicator
    • errorWidget:图片加载失败时显示的错误小部件。这里使用了一个错误图标。
    • fit:设置图片的适应方式。
    • widthheight:设置图片的宽度和高度。
    • cacheConfig:配置缓存参数,如最大缓存时间、最大缓存对象数量以及缓存存储位置(内存或磁盘)。
    • progressIndicatorBuilder:自定义下载进度指示器。这里使用了一个线性进度指示器。

通过这种方式,你可以轻松地在 Flutter 应用中实现图片的优化加载和缓存管理。optimized_cached_image 提供了丰富的配置选项,可以根据你的需求进行进一步自定义。

回到顶部