Flutter SVG自适应加载插件leancode_flutter_svg_adaptive_loader的使用

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

Flutter SVG自适应加载插件leancode_flutter_svg_adaptive_loader的使用

简介

leancode_flutter_svg_adaptive_loader 是一个用于在 Flutter 应用中自适应加载 SVG 和 SVG.vec 资源的插件。该插件在加载资源时会检查文件格式(XML 基础或二进制),并根据格式进行相应的加载。

动机

创建此插件的动机是为了在保持原始 XML 基础向量资源的同时,在 CI/CD 过程中编译这些资源以减小文件大小和加载时间。假设调试环境使用 XML 基础资源,而发布应用使用编译后的二进制资源,这需要一种检查向量格式的方法。FlutterSvgAdaptiveLoader 的设计就是为了减轻程序员的这一责任。

为了使这一切正常工作,我们建议在 CI/CD 过程中编译资产时保留 .svg 扩展名而不是 .svg.vec。更改扩展名将需要相应地更新代码中的资产路径。

使用方法

基本用法

要使用自适应 SVG 加载器,只需将 FlutterSvgAdaptiveLoader 对象传递给你的 SvgPicture

SvgPicture(FlutterSvgAdaptiveLoader('assets/foo.svg')),

使用 flutter_gen

如果你使用了 flutter_gen 包,可以复制以下代码并使用 adaptiveSvg() 方法作为 SvgGenImage 的扩展:

import 'package:leancode_flutter_svg_adaptive_loader/leancode_flutter_svg_adaptive_loader.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_svg/flutter_svg.dart';
// TODO: 添加对 `flutter_gen` 生成的 `SvgGenImage` 的导入

extension AdaptiveSvgGenImage on SvgGenImage {
  SvgPicture adaptiveSvg({
    Key? key,
    bool matchTextDirection = false,
    AssetBundle? bundle,
    String? package,
    double? width,
    double? height,
    BoxFit fit = BoxFit.contain,
    AlignmentGeometry alignment = Alignment.center,
    bool allowDrawingOutsideViewBox = false,
    WidgetBuilder? placeholderBuilder,
    String? semanticsLabel,
    bool excludeFromSemantics = false,
    ColorFilter? colorFilter,
    Clip clipBehavior = Clip.hardEdge,
  }) {
    return SvgPicture(
      FlutterSvgAdaptiveLoader(
        path,
        assetBundle: bundle,
        packageName: package,
      ),
      key: key,
      matchTextDirection: matchTextDirection,
      width: width,
      height: height,
      fit: fit,
      alignment: alignment,
      allowDrawingOutsideViewBox: allowDrawingOutsideViewBox,
      placeholderBuilder: placeholderBuilder,
      semanticsLabel: semanticsLabel,
      excludeFromSemantics: excludeFromSemantics,
      colorFilter: colorFilter,
      clipBehavior: clipBehavior,
    );
  }
}

然后,你可以在生成的资产类上调用该扩展方法:

Assets.foo.adaptiveSvg()

示例代码

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

import 'package:example/adaptive_svg_gen_image.dart';
import 'package:example/gen/assets.gen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:leancode_flutter_svg_adaptive_loader/leancode_flutter_svg_adaptive_loader.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
                'Assets created by SvgPicture(LeancodeFlutterSvgAdaptiveLoader("asset_path"))'),
            const SizedBox(height: 8),
            const Row(
              children: [
                Expanded(
                  child: _SvgPictureWithTitle(
                    text: 'XML-based foo',
                    svgPicture: SvgPicture(
                      FlutterSvgAdaptiveLoader('assets/foo.svg'),
                    ),
                  ),
                ),
                SizedBox(width: 16),
                Expanded(
                  child: _SvgPictureWithTitle(
                    text: 'Binary compiled foo',
                    svgPicture: SvgPicture(
                      FlutterSvgAdaptiveLoader(
                        'assets/foo_compiled.svg',
                      ),
                    ),
                  ),
                ),
              ],
            ),
            const Divider(),
            const Text('Assets created by SvgGenImage.adaptiveSvg()'),
            const SizedBox(height: 8),
            Row(
              children: [
                Expanded(
                  child: _SvgPictureWithTitle(
                    text: 'XML-based foo',
                    svgPicture: Assets.foo.adaptiveSvg(),
                  ),
                ),
                const SizedBox(width: 16),
                Expanded(
                  child: _SvgPictureWithTitle(
                    text: 'Binary compiled foo',
                    svgPicture: Assets.fooCompiled.adaptiveSvg(),
                  ),
                ),
              ],
            )
          ],
        ),
      ),
    );
  }
}

class _SvgPictureWithTitle extends StatelessWidget {
  const _SvgPictureWithTitle({
    required this.text,
    required this.svgPicture,
  });

  final String text;
  final Widget svgPicture;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Text(text),
        const SizedBox(height: 8),
        svgPicture,
      ],
    );
  }
}

在这个示例中,我们展示了如何使用 FlutterSvgAdaptiveLoader 来加载 XML 基础和二进制编译的 SVG 资源,并通过 adaptiveSvg() 方法来简化代码。希望这个示例对你有所帮助!


更多关于Flutter SVG自适应加载插件leancode_flutter_svg_adaptive_loader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter SVG自适应加载插件leancode_flutter_svg_adaptive_loader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 leancode_flutter_svg_adaptive_loader 插件的示例代码。这个插件主要用于在 Flutter 应用中自适应加载 SVG 图像。

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

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

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

以下是一个简单的示例代码,展示如何使用 leancode_flutter_svg_adaptive_loader 插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SVG Adaptive Loader Example'),
        ),
        body: Center(
          child: AdaptiveSvgLoader(
            // 替换为你的 SVG 文件 URL
            svgUrl: 'https://example.com/your-image.svg',
            // 设置占位符(加载中的图标)
            placeholder: CircularProgressIndicator(),
            // 设置加载失败时的图标
            errorWidget: Icon(Icons.error),
            // 设置宽度和高度(可选)
            width: 200,
            height: 200,
            // 设置 SVG 渲染时的其他参数(可选)
            svgRenderOptions: SvgRenderOptions(
              color: Colors.blue,
            ),
          ),
        ),
      ),
    );
  }
}

解释

  1. 依赖导入

    import 'package:leancode_flutter_svg_adaptive_loader/leancode_flutter_svg_adaptive_loader.dart';
    
  2. AdaptiveSvgLoader 组件

    • svgUrl:SVG 文件的 URL。
    • placeholder:在 SVG 图像加载期间显示的占位符。这里使用了 CircularProgressIndicator
    • errorWidget:在加载 SVG 图像失败时显示的错误图标。这里使用了 Icon(Icons.error)
    • widthheight:SVG 图像的宽度和高度(可选)。
    • svgRenderOptions:SVG 渲染时的其他参数,如颜色(可选)。

注意事项

  • 确保 svgUrl 是一个有效的 SVG 文件 URL。
  • placeholdererrorWidget 可以根据需要自定义。
  • svgRenderOptions 提供了更多自定义 SVG 渲染的选项,例如颜色、透明度等。

通过这种方式,你可以在 Flutter 应用中轻松实现 SVG 图像的自适应加载,并提供加载中和加载失败的反馈。

回到顶部