Flutter图片预加载与缓存插件precached_network_image的使用

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

Flutter图片预加载与缓存插件precached_network_image的使用

Precached network image 插件介绍

简介: Flutter库,用于从网络加载和缓存图片到磁盘,并支持提前缓存图片到内存中,以避免由于延迟时间导致的闪屏问题。

使用说明

  • 直接使用: 可以直接使用 PrecachedNetworkImage

    PrecachedNetworkImage(
      url: 'https://picsum.photos/200',
      width: 200, 
      height: 200,
      precache: true, // 默认为false,true表示下次加载时从内存中提前缓存。
      fit: BoxFit.fill,
      placeholder: (context, url) => const Icon(Icons.person),
      errorWidget: (context, url, error) {
        log("get image failed code: $error");
        return const Icon(Icons.error);
      },
    ),
    
  • 提前缓存到内存: 如果想要提前将图片缓存到内存中,可以调用 PrecachedNetworkImageManager.instance.precacheNetworkImages(isLog: true) 来在启动时读取磁盘文件到内存中。

    [@override](/user/override)
    void initState() {
      super.initState();
      PrecachedNetworkImageManager.instance.precacheNetworkImages(isLog: true);
    }
    

PrecachedNetworkImageManager 方法介绍

  • precacheNetworkImages: 将所有URL(或目标参数URLs)缓存到内存中的文件中。
    • 用途: 在启动时调用此方法可以避免由于延迟时间导致的闪屏问题。
    • 示例: 设置 PrecachedNetworkImage(..., precache: true)true 后,可以在启动时调用此方法。
  • addPrecache: 添加需要提前缓存的URL。
    addPrecache({[@required](/user/required) String url});
    
  • deletePrecache: 删除取消缓存的URL。
    deletePrecache({[@required](/user/required) String url});
    
  • deleteImageCache: 删除给定URL缓存在内存和磁盘上的文件。
    deleteImageCache({[@required](/user/required) String url});
    
  • cleanImageCache: 清除给定URL缓存在内存和磁盘上的文件。
    cleanImageCache();
    
  • cleanPrecache: 清除所有URL的缓存。
    cleanPrecache();
    
  • cleanCaches: 清除所有URL的缓存以及内存和磁盘上的文件缓存。
    cleanCaches();
    

示例代码

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('New Page'),
      ),
      body: Center(
        child: PrecachedNetworkImage(
          url: 'https://picsum.photos/300',
          width: 300,
          height: 300,
          precache: false,
          placeholder: (context, url) => const Icon(Icons.person),
          errorWidget: (context, url, error) {
            log("get image failed code: $error");
            return const Icon(Icons.error);
          },
        ),
      ),
    );
  }
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
    // PrecachedNetworkImageManager.instance.cleanCaches();
    PrecachedNetworkImageManager.instance.precacheNetworkImages(isLog: true);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      initialIndex: 0,
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          title: const Text('PrecachedNetworkImage'),
          bottom: const TabBar(
            tabs: [
              Tab(icon: Icon(Icons.cloud_outlined)),
              Tab(icon: Icon(Icons.beach_access_sharp)),
            ],
          ),
        ),
        body: TabBarView(
          children: [
            Center(
              child: ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => const NewPage()),
                  );
                },
                child: const Text('Go to New Page'),
              ),
            ),
            Center(
              child: PrecachedNetworkImage(
                url: 'https://picsum.photos/300',
                width: 300,
                height: 300,
                precache: true,
                placeholder: (context, url) => const Icon(Icons.person),
                errorWidget: (context, url, error) {
                  log("get image failed code: $error");
                  return const Icon(Icons.error);
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

  final String title;

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

Future<void> main() async {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用precached_network_image插件进行图片预加载与缓存的示例代码。

首先,确保你的pubspec.yaml文件中已经添加了precached_network_image依赖:

dependencies:
  flutter:
    sdk: flutter
  precached_network_image: ^3.0.0 # 请根据需要调整版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以按照以下方式使用PrecachedImageProviderPrecachedNetworkImage来预加载和缓存网络图片。

示例代码

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

void main() {
  // 预加载图片
  _precacheImages();

  runApp(MyApp());
}

void _precacheImages() {
  // 预加载网络图片
  precacheImage(NetworkImage('https://example.com/image1.jpg'), context);
  precacheImage(NetworkImage('https://example.com/image2.jpg'), context);

  // 你也可以使用 PrecachedImageProvider 来预加载图片
  final precachedImageProvider1 = PrecachedImageProvider(
    NetworkImage('https://example.com/image1.jpg'),
  );
  final precachedImageProvider2 = PrecachedImageProvider(
    NetworkImage('https://example.com/image2.jpg'),
  );

  // PrecachedImageProvider 本身不会立即加载图片,但它会在需要时被缓存和使用
  // 这里只是为了演示如何创建 PrecachedImageProvider 实例
}

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Precached Network Image Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用 PrecachedNetworkImage 小部件来显示预加载的图片
            PrecachedNetworkImage(
              imageUrl: 'https://example.com/image1.jpg',
              placeholder: (context, url) => CircularProgressIndicator(),
              errorWidget: (context, url, error) => Icon(Icons.error),
            ),
            SizedBox(height: 20),
            PrecachedNetworkImage(
              imageUrl: 'https://example.com/image2.jpg',
              placeholder: (context, url) => CircularProgressIndicator(),
              errorWidget: (context, url, error) => Icon(Icons.error),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 预加载图片

    • main函数中,我们调用_precacheImages函数来预加载两张网络图片。
    • 使用precacheImage函数可以将图片预加载到内存中,以便在应用启动时更快地显示图片。
    • PrecachedImageProvider也可以用来预加载图片,但通常它是在需要时被缓存和使用的,这里只是为了演示如何创建PrecachedImageProvider实例。
  2. 显示图片

    • MyHomePage中,我们使用PrecachedNetworkImage小部件来显示预加载的图片。
    • placeholder参数用于在图片加载时显示占位符(例如,一个进度指示器)。
    • errorWidget参数用于在图片加载失败时显示错误小部件(例如,一个错误图标)。

通过这种方式,你可以在应用启动时预加载一些重要的图片,并在需要时快速显示它们,同时利用缓存机制减少不必要的网络请求。

回到顶部