Flutter高级网络图片加载插件flutter_advanced_networkimage_2的使用

Flutter 高级网络图片加载插件 flutter_advanced_networkimage_2 的使用

简介

flutter_advanced_networkimage_2 是一个高级的 Flutter 图片加载插件,它提供了缓存和重试功能。该项目是从 flutter_advanced_networkimage 迁移而来,并且已经迁移到了空安全。

开始使用

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_advanced_networkimage_2: any

然后运行以下命令来获取依赖:

flutter packages get
示例

以下是一些使用 flutter_advanced_networkimage_2 加载网络图片的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_advanced_networkimage_2/provider.dart';
import 'package:flutter_advanced_networkimage_2/transition.dart';
import 'package:flutter_advanced_networkimage_2/zoomable.dart';

void main() {
  runApp(MaterialApp(
    title: 'Flutter Example',
    theme: ThemeData(primaryColor: Colors.blue),
    home: const MyApp(),
  ));
}

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

  @override
  State<MyApp> createState() => Example();
}

class Example extends State<MyApp> {
  final String url = 'https://openexpoeurope.com/wp-content/uploads/2019/12/flutter-logo-sharing.png';
  final String svgUrl = 'https://github.com/dart-lang/site-shared/raw/master/src/_assets/image/flutter/logo/default.svg';

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Advanced Network Image Example'),
          bottom: const TabBar(
            isScrollable: true,
            tabs: [
              Tab(text: '加载图片'),
              Tab(text: '缩放小部件'),
              Tab(text: '缩放列表'),
            ],
          ),
        ),
        body: TabBarView(
          physics: const NeverScrollableScrollPhysics(),
          children: [
            LoadImage(url: url, svgUrl: svgUrl),
            ZoomableImage(url: url),
            ZoomableImages(url: url),
          ],
        ),
      ),
    );
  }
}

class LoadImage extends StatelessWidget {
  const LoadImage({required this.url, required this.svgUrl, Key? key}) : super(key: key);

  final String url;
  final String svgUrl;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TransitionToImage(
          image: AdvancedNetworkImage(
            url,
            loadedCallback: () => print('加载完成!'),
            loadFailedCallback: () => print('加载失败!'),
            timeoutDuration: const Duration(seconds: 30),
            retryLimit: 1,
          ),
          fit: BoxFit.contain,
          placeholder: Container(
            width: 300.0,
            height: 300.0,
            color: Colors.transparent,
            child: const Icon(Icons.refresh),
          ),
          imageFilter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
          width: 300.0,
          height: 300.0,
          enableRefresh: true,
          loadingWidgetBuilder: (
            context,
            progress,
            imageData,
          ) {
            return Container(
              width: 300.0,
              height: 300.0,
              alignment: Alignment.center,
              child: CircularProgressIndicator(
                value: progress == 0.0 ? null : progress,
              ),
            );
          },
        ),
        Expanded(
          child: SvgPicture(
            AdvancedNetworkSvg(
              svgUrl,
              (theme) => (bytes, colorFilter, key) {
                return svg.svgPictureDecoder(
                  bytes ?? Uint8List.fromList(const []),
                  false,
                  colorFilter,
                  key,
                  theme: theme,
                );
              },
            ),
          ),
        ),
      ],
    );
  }
}

class ZoomableImage extends StatelessWidget {
  const ZoomableImage({required this.url, Key? key}) : super(key: key);

  final String url;

  @override
  Widget build(BuildContext context) {
    return ZoomableWidget(
      maxScale: 5.0,
      minScale: 0.5,
      multiFingersPan: false,
      autoCenter: true,
      child: Image(image: AdvancedNetworkImage(url)),
    );
  }
}

class ZoomableImages extends StatelessWidget {
  const ZoomableImages({required this.url, Key? key}) : super(key: key);

  final String url;

  @override
  Widget build(BuildContext context) {
    return ZoomableList(
      maxScale: 2.0,
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Image(image: AdvancedNetworkImage(url)),
          Image(image: AdvancedNetworkImage(url)),
          Image(image: AdvancedNetworkImage(url)),
          Image(image: AdvancedNetworkImage(url)),
          Image(image: AdvancedNetworkImage(url)),
        ],
      ),
    );
  }
}

获取磁盘缓存文件夹大小

你可以通过以下代码获取磁盘缓存文件夹的大小:

int cacheSize = await DiskCache().cacheSize();

清理磁盘缓存

你可以通过以下代码清理磁盘缓存:

bool isSucceed = await DiskCache().clear();

使用缩放小部件和过渡到图像小部件

ZoomableWidget(
  minScale: 0.3,
  maxScale: 2.0,
  panLimit: 0.8,
  child: Container(
    child: TransitionToImage(
      image: AdvancedNetworkImage(url, timeoutDuration: Duration(minutes: 1)),
      placeholder: CircularProgressIndicator(),
      duration: Duration(milliseconds: 300),
    ),
  ),
)

包含重新加载功能

TransitionToImage(
  image: AdvancedNetworkImage(url,
    loadedCallback: () {
      print('It works!');
    },
    loadFailedCallback: () {
      print('Oh, no!');
    },
    loadingProgress: (double progress) {
      print('Now Loading: $progress');
    },
  ),
  loadingWidgetBuilder: (_, double progress, __) => Text(progress.toString()),
  fit: BoxFit.contain,
  placeholder: const Icon(Icons.refresh),
  width: 400.0,
  height: 300.0,
  enableRefresh: true,
);

缩放小部件大小

ZoomableWidget(
  panLimit: 1.0,
  maxScale: 2.0,
  minScale: 0.5,
  singleFingerPan: true,
  multiFingersPan: false,
  enableRotate: true,
  child: Image(
    image: AssetImage('graphics/background.png'),
  ),
  zoomSteps: 3,
),

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

1 回复

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


当然,以下是一个关于如何使用 flutter_advanced_networkimage_2 插件在 Flutter 应用中加载网络图片的示例代码。这个插件提供了比 Flutter 内置的 Image.network 更丰富的功能,比如缓存、占位图、失败重试等。

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

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

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

接下来,在你的 Dart 文件中使用 AdvancedNetworkImage 组件来加载网络图片。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Advanced Network Image Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // 使用 AdvancedNetworkImage 加载网络图片
              AdvancedNetworkImage(
                imageUrl: 'https://example.com/image.jpg',  // 替换为你的图片URL
                placeholder: CircularProgressIndicator(),  // 占位图
                loadingBuilder: (context, widget, imageProvider) => Placeholder(
                  fallbackWidth: 200,
                  fallbackHeight: 200,
                  color: Colors.grey[300]!,
                ),
                errorWidget: (context, url, error) => Icon(Icons.error),  // 加载失败时的显示
                fadeInDuration: Duration(seconds: 1),  // 淡入动画时长
                retryLimit: 3,  // 最大重试次数
                retryDuration: Duration(seconds: 2),  // 重试间隔
              ),
              SizedBox(height: 20),
              // 另一个示例,使用不同的配置
              AdvancedNetworkImage(
                imageUrl: 'https://example.com/another_image.jpg',  // 替换为你的图片URL
                placeholder: Icon(Icons.photo),  // 使用图标作为占位图
                errorWidget: (context, url, error) => Text('Failed to load image'),  // 加载失败时的显示
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  • imageUrl 是你要加载的图片的 URL。
  • placeholder 是加载图片时显示的占位图。这里使用了 CircularProgressIndicatorIcon 作为两个不同的占位图示例。
  • loadingBuilder 是一个自定义的加载中状态显示,这里使用了 Placeholder 组件。
  • errorWidget 是加载图片失败时显示的组件。
  • fadeInDuration 是图片加载完成后的淡入动画时长。
  • retryLimitretryDuration 分别设置了最大重试次数和每次重试的间隔。

你可以根据需要调整这些参数来满足你的应用需求。这个插件提供了灵活的配置选项,可以帮助你更好地管理网络图片的加载和显示。

回到顶部