Flutter网络图片加载插件universal_web_image的使用

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

Flutter网络图片加载插件universal_web_image的使用

Features

  • 显示HTML图像:如果必要,可以将图像显示为HTML图像。
  • 自动区分SVG图像和其他图像:插件会自动识别并处理SVG图像。

Motivation

在尝试加载没有有效XHR状态200的图像时,Flutter Web应用会抛出错误,并且图像不会显示。例如:

Failed to load network image.
Image URL: https://example.com/invalidConfiguredServerImage.jpg
Trying to load an image from another domain? Find answers at:
https://flutter.dev/docs/development/platform-integration/web-images

universal_web_image 插件通过使用Web Image作为回退来解决这个问题。

Usage

示例代码

以下是一个完整的示例代码,展示了如何使用 universal_web_image 插件加载网络图片。

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Universal Web Image Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Universal Web Image Demo Page'),
    );
  }
}

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

  final String title;

  // 424x283
  static const validImageUrl =
      'https://www.kesselheld.de/content/uploads/2018/09/durchschnittliche-heizkosten.jpg';

  // 640x300
  static const invalidImageUrl =
      'https://img.utopia.de/cH68CrxH2UEqUr8eVAWC-BCgXoU=/640x300/https://utopia.de/app/uploads/2019/02/richtig-heizen-wpb-ivan-kruk-ri-190820-1280x720.jpg';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            const Text(
              'Web Image with valid XHR 200 status with custom loader',
            ),
            UniversalWebImage(
              imageUrl: validImageUrl,
              customLoaderBuilder: (context) =>
                  const Center(child: CircularProgressIndicator()),
            ),
            const Text(
              'Web Image with invalid XHR 0 status',
            ),
            const UniversalWebImage(
              imageUrl: invalidImageUrl,
              width: 640,
              height: 300,
            ),
            const Text(
              'Regular image with invalid XHR 0 status',
            ),
            Image.network(
              invalidImageUrl,
              width: 640,
              height: 300,
            ),
          ],
        ),
      ),
    );
  }
}

代码说明

  1. 导入依赖

    import 'package:flutter/material.dart';
    import 'package:universal_web_image/universal_web_image.dart';
    
  2. 定义主应用

    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Universal Web Image Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: const MyHomePage(title: 'Universal Web Image Demo Page'),
        );
      }
    }
    
  3. 定义主页

    class MyHomePage extends StatelessWidget {
      const MyHomePage({super.key, required this.title});
    
      final String title;
    
      static const validImageUrl =
          'https://www.kesselheld.de/content/uploads/2018/09/durchschnittliche-heizkosten.jpg';
    
      static const invalidImageUrl =
          'https://img.utopia.de/cH68CrxH2UEqUr8eVAWC-BCgXoU=/640x300/https://utopia.de/app/uploads/2019/02/richtig-heizen-wpb-ivan-kruk-ri-190820-1280x720.jpg';
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                const Text(
                  'Web Image with valid XHR 200 status with custom loader',
                ),
                UniversalWebImage(
                  imageUrl: validImageUrl,
                  customLoaderBuilder: (context) =>
                      const Center(child: CircularProgressIndicator()),
                ),
                const Text(
                  'Web Image with invalid XHR 0 status',
                ),
                const UniversalWebImage(
                  imageUrl: invalidImageUrl,
                  width: 640,
                  height: 300,
                ),
                const Text(
                  'Regular image with invalid XHR 0 status',
                ),
                Image.network(
                  invalidImageUrl,
                  width: 640,
                  height: 300,
                ),
              ],
            ),
          ),
        );
      }
    }
    

关键点

  • UniversalWebImage:用于加载网络图片,并自动处理无效的XHR状态。
  • customLoaderBuilder:自定义加载器,可以在图片加载过程中显示一个加载指示器。
  • validImageUrlinvalidImageUrl:分别表示有效的和无效的图片URL。

通过使用 universal_web_image 插件,你可以更方便地处理网络图片加载问题,特别是在Web平台上。希望这个示例对你有所帮助!


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

1 回复

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


当然,以下是如何在Flutter项目中使用universal_web_image插件来加载网络图片的详细代码示例。universal_web_image 是一个强大的图片加载库,支持多种图片源和缓存策略。

1. 添加依赖

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

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

2. 导入包

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

import 'package:universal_web_image/universal_web_image.dart';

3. 配置缓存

通常,你会在应用的初始化部分配置全局的缓存设置。你可以在main.dart文件中进行配置:

import 'package:flutter/material.dart';
import 'package:universal_web_image/universal_image_loader.dart';

void main() {
  // 初始化全局图片加载器
  UniversalImageLoader.instance
    ..defaultMemoryCacheSize = 100 * 1024 * 1024  // 设置内存缓存大小
    ..defaultDiskCacheSize = 100 * 1024 * 1024    // 设置磁盘缓存大小
    ..init(context: getApplicationContext());  // 初始化上下文(通常在Android中使用)

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImageScreen(),
    );
  }
}

4. 使用UniversalImage加载网络图片

在你的具体页面中,使用UniversalImage小部件来加载网络图片:

import 'package:flutter/material.dart';
import 'package:universal_web_image/universal_image_widget.dart';

class ImageScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String imageUrl = "https://example.com/path/to/your/image.jpg";

    return Scaffold(
      appBar: AppBar(
        title: Text("Universal Web Image Example"),
      ),
      body: Center(
        child: UniversalImage(
          imageUrl,
          placeholder: Image.asset('assets/placeholder.png'),  // 占位图
          errorWidget: Icon(Icons.error),  // 加载失败时显示的控件
          loadingWidget: CircularProgressIndicator(),  // 加载时显示的控件
          imageBuilder: (context, imageProvider) {
            return FadeInImage.memoryNetwork(
              placeholder: kTransparentImage,
              image: imageUrl,
              fit: BoxFit.cover,
            );
          },
          // 其他可选参数
          width: 300,
          height: 200,
        ),
      ),
    );
  }
}

5. 运行应用

确保你已经正确配置了所有依赖并运行应用:

flutter pub get
flutter run

注意事项

  1. 占位图和错误图:确保你已经将占位图和错误图放在assets目录下,并在pubspec.yaml中声明。
  2. 缓存管理universal_web_image 提供了丰富的缓存管理功能,你可以根据需要进行配置,如清理缓存等。
  3. 网络权限:如果你的应用需要访问网络,确保在AndroidManifest.xmlInfo.plist中声明了网络权限。

以上代码示例展示了如何在Flutter项目中使用universal_web_image插件来加载网络图片。如果你需要更多高级功能,请查阅官方文档

回到顶部