Flutter安全显示SVG图片插件websafe_svg的使用

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

Flutter安全显示SVG图片插件websafe_svg的使用

websafe_svg

Dart Publisher

websafe_svg是一个与Flutter兼容的库,用于处理Android、iOS和Web上的SVG图像。

使用库

要使用此库,请先将它添加到您的Flutter pubspec.yaml文件中:

dependencies:
  websafe_svg: ^<version> 

然后运行以下命令以获取包:

flutter packages get

支持类型

  • asset
  • network
  • memory
  • string

示例代码

以下是一个完整的示例应用程序,展示了如何使用websafe_svg来显示不同来源的SVG图片。

main.dart

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WebsafeSvg Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('WebsafeSvg Example'),
      ),
      body: ListView(
        children: [
          ListTile(
            onTap: () => Navigator.of(context).push(
              MaterialPageRoute(
                builder: (BuildContext context) => AssetSvgPage(),
              ),
            ),
            title: const Text('Assets'),
          ),
          ListTile(
            onTap: () => Navigator.of(context).push(
              MaterialPageRoute(
                builder: (BuildContext context) => NetworkSvgPage(),
              ),
            ),
            title: const Text('Network'),
          ),
          ListTile(
            onTap: () => Navigator.of(context).push(
              MaterialPageRoute(
                builder: (BuildContext context) => MemorySvgPage(),
              ),
            ),
            title: const Text('Memory'),
          ),
          ListTile(
            onTap: () => Navigator.of(context).push(
              MaterialPageRoute(
                builder: (BuildContext context) => StringSvgPage(),
              ),
            ),
            title: const Text('String'),
          ),
        ],
      ),
    );
  }
}

asset_svg_page.dart

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

class AssetSvgPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Asset SVG'),
      ),
      body: Center(
        child: WebsafeSvg.asset(
          'assets/images/example.svg', // 确保在pubspec.yaml中声明了该资源路径
          width: 200,
          height: 200,
        ),
      ),
    );
  }
}

network_svg_page.dart

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

class NetworkSvgPage extends StatelessWidget {
  final String _url = "https://example.com/path/to/your/image.svg";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Network SVG'),
      ),
      body: Center(
        child: WebsafeSvg.network(
          _url,
          width: 200,
          height: 200,
        ),
      ),
    );
  }
}

memory_svg_page.dart

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

class MemorySvgPage extends StatelessWidget {
  final List<int> _bytes = [/* SVG 图片的字节数据 */];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Memory SVG'),
      ),
      body: Center(
        child: WebsafeSvg.memory(
          _bytes,
          width: 200,
          height: 200,
        ),
      ),
    );
  }
}

string_svg_page.dart

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

class StringSvgPage extends StatelessWidget {
  final String _svgString = '<svg ...></svg>'; // SVG XML 字符串

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('String SVG'),
      ),
      body: Center(
        child: WebsafeSvg.string(
          _svgString,
          width: 200,
          height: 200,
        ),
      ),
    );
  }
}

通过上述代码,您可以创建一个包含多个页面的应用程序,每个页面展示一种加载SVG图片的方式。确保根据实际情况调整SVG资源路径和其他配置。


更多关于Flutter安全显示SVG图片插件websafe_svg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全显示SVG图片插件websafe_svg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是如何在Flutter项目中安全地显示SVG图片,使用websafe_svg插件的示例代码。websafe_svg插件允许你在Flutter应用中安全地渲染SVG图像,防止潜在的安全风险,如SVG注入攻击。

步骤 1:添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  websafe_svg: ^x.y.z  # 请使用最新版本号

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

步骤 2:导入插件

在你的Flutter组件或页面中导入websafe_svg

import 'package:websafe_svg/websafe_svg.dart';

步骤 3:使用WebsafeSvg加载和显示SVG图片

下面是一个完整的示例,展示如何在Flutter应用中加载并显示一个SVG图片:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Safe SVG Display'),
        ),
        body: Center(
          child: SafeSvgExample(),
        ),
      ),
    );
  }
}

class SafeSvgExample extends StatelessWidget {
  final String svgData = '''
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
    <circle cx="12" cy="12" r="10" stroke="black" stroke-width="3" fill="red" />
  </svg>
  ''';

  @override
  Widget build(BuildContext context) {
    return WebsafeSvg.asset(
      svgAsset: svgData,  // 这里可以使用SVG数据字符串
      // 如果你想从文件加载,可以使用 svgAsset: 'assets/example.svg',并确保在pubspec.yaml中声明了assets
      width: 200,
      height: 200,
      // 你可以添加其他属性,如color,alignment等
    );
  }
}

注意事项

  1. SVG数据安全websafe_svg通过清理SVG输入来防止注入攻击。如果你使用从网络或用户输入获取的SVG数据,确保进行适当的验证和清理。

  2. SVG数据格式:在上面的示例中,svgData是一个硬编码的SVG字符串。如果你从文件加载SVG,确保在pubspec.yaml中声明了assets,并使用svgAsset: 'assets/example.svg'

  3. 错误处理:在实际应用中,建议添加错误处理逻辑,以处理SVG解析失败的情况。

通过这种方式,你可以在Flutter应用中安全地显示SVG图像,同时利用websafe_svg插件提供的保护机制来防止潜在的安全风险。

回到顶部