Флаттер SVG рендеринг

Я попытался добавить изображение с исходным SVG-кодом в мое приложение.

new AssetImage("assets/images/candle.svg"))

Но я не получил никакой визуальной обратной связи. Как я могу сделать изображение SVG во флаттере?

15 ответов

Решение

Flutter в настоящее время не поддерживает SVG. Следите за выпуском 1831 за обновлениями.

Если вам абсолютно необходимо векторное рисование, вы можете увидеть виджет Flutter Logo в качестве примера того, как рисовать с помощью Canvas API, или растеризуйте свое изображение на нативной стороне и передайте его в Flutter в качестве растрового изображения, но на данный момент лучше всего вставлять растеризованные изображения активов с высоким разрешением.

Шрифты - отличный вариант для многих случаев.

Я работал над библиотекой для визуализации SVG на холсте, доступной здесь: https://github.com/dnfield/flutter_svg

API на данный момент будет выглядеть примерно так

new SvgPicture.asset('asset_name.svg')

отобразить asset_name.svg (по размеру к его родителю, например SizedBox). Вы также можете указать color а также blendMode для тонирования актива..

Теперь он доступен в пабе и работает с минимальной версией Flutter 0.3.6. Он обрабатывает множество случаев, но не все - см. Репозиторий GitHub для получения обновлений и проблем с файлами.

Оригинальная проблема GitHub, на которую ссылается Колин Джексон, на самом деле не предназначена для того, чтобы в первую очередь фокусироваться на SVG во Флаттере. Я открыл еще одну проблему для этого: https://github.com/flutter/flutter/issues/15501

Flutter сделал новую библиотеку flutter_svg: ^0.5.0` для обработки файлов SVG. Мы можем использовать его как

new SvgPicture.asset(
  'assets/images/candle.svg',
  height: 20.0,
  width: 20.0,
  allowDrawingOutsideViewBox: true,
),

Обходной путь пока что использует шрифты

https://icomoon.io/

  fonts:
   - family: icomoon
     fonts:
       - asset: assets/fonts/icomoon.ttf

Useage

  static const IconData TabBarHome= const IconData(0xe906, fontFamily: 'icomoon');
  static const IconData TabBarExplore= const IconData(0xe902, fontFamily: 'icomoon');

Заменить ### например (906)

Вы можете выполнить следующие шаги
- посетите http://fluttericon.com/
- загрузите свои значки SVG
- нажмите кнопку загрузки
- вы получите два файла:
1. iconname.dart
2. iconname.ttf файл шрифта
- используйте этот файл во флаттере и импортировать iconname.dart

Шаг 1. добавьте зависимость в свой pubspec.yaml

      dependencies:
     flutter_svg: any

Преимущество любой версии в том, что ее можно использовать в любой версии SDK.

Шаг 2. импортируйте пакет fluttersvg в свое приложение

       import 'package:flutter_svg/flutter_svg.dart';

шаг 3. просто используйте, как показано ниже

       SvgPicture.asset(
    'assets/images/bm-icon1.svg',
     width: 18.0,
     height: 18.0,
  ),

Вы можете использовать эту библиотеку для рендеринга изображений SVG - https://pub.dev/packages/flutter_svg

Пример -

Container(
    child: SvgPicture.asset("assets/images/yourImage.svg")
)

Возможный интерес: есть более новая библиотека SVG Flutter под названием jovial_svg. Я написал его для обработки более надежного подмножества SVG, чем то, что мне удалось найти на pub.dev в то время. Пока я этим занимался, я также создал двоичный формат, в который можно компилировать ресурсы SVG. Он немного компактнее и примерно в 10 раз быстрее читается, поэтому это хороший выбор для ресурсов, которые вы упаковываете с приложением.

Библиотека находится по адресу https://pub.dev/packages/jovial_svg.

Я решил аналогичную проблему, преобразовав изображения svg в ttf на fluttericon.com.

Это необходимые шаги.

Храните все ваши файлы svg в папке. Загрузите их все на fluttericon с помощью загрузчика. Вы можете выбрать их все и перетащить в нужное место. Дайте своим значкам имя класса дротика вверху: например, Svgicons.

Выберите все свои значки и нажмите «Загрузить».

Он загрузит zip-файл с файлом dart и папкой шрифтов, которая содержит Svgicons.ttf.

скопируйте папку fonts в папку проекта и укажите ее как актив в pubspec.yaml.

      fonts:
  - family: Svgicons
    fonts:
      - asset: fonts/Svgicons.ttf

импортируйте svgicons_icons.dart, где вы собираетесь использовать изображения. Образец:

      import '../svgicons_icons.dart';

import 'social_media.dart';

class SocialMediaRepository {
  List<SocialMedia> getSocialMedia = [
    SocialMedia(id: 1, title: "Facebook", iconAsset:Svgicons.facebook, isFavorite: false),
    SocialMedia(id: 2, title: "Instagram", iconAsset: Svgicons.instagram, isFavorite: false),
    SocialMedia(id: 3, title: "LinkedIn", iconAsset: Svgicons.linkedin, isFavorite: false),
    ....

Здесь iconAsset имеет тип IconData, который изначально был строкой, относящейся к изображению svg.

Отобразите ttf с помощью

          ...
    Icon(item.iconAsset),
    SizedBox(width: 10),
    Text(item.title),
  ],
),

где элемент — это объект, содержащий IconData. Теперь вы можете удалить ссылку на изображения svg из проекта.

поддержка флаттера специального типа svg

если есть тег стиля, тогда не загружать изображение svg во флаттер флаттер поддерживает встроенный стиль в svg

Вы можете использовать вспышку для создания анимации и просто импортировать.flr как актив

import 'package:flare_flutter/flare_actor.dart';
class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new FlareActor("assets/Filip.flr", alignment:Alignment.center, fit:BoxFit.contain, animation:"idle");
  }
}

посетите flare_flutter https://pub.dev/packages/flare_flutter

Шаг 1:

flutter_svg: ^0.12.4

Шаг 2:

import 'package:flutter_svg/flutter_svg.dart';

Шаг 3:

SizedBox.fromSize(
      child:  SvgPicture.asset(
        'assets/empty.svg',
      ),
      size: Size(300.0, 400.0),
    ),     

pubspeck.yaml

dependencies:
    flutter_svg: ^0.12.4

Код: стек и позиционируется, чтобы установить абсолютную позицию SVG

        Stack(
            children: <Widget>[
              Positioned(
                  right: 0,
                  child: IconButton(
                    icon: SvgPicture.asset('assets/profileView/iconAjustes.svg',
                        height: 30,
                        width: 30,
                        color: Colors.white, 
                        semanticsLabel: 'Ajustes Logo'
                      ),
                    onPressed: _onPrefsButtonPressed,
                  )
              ),
            ],
          )

SVG во флаттере https://pub.dev/packages/flutter_svg

  1. добавить пакет в pubspec.yaml

    зависимости: flutter_svg: любой

    активы:
    -активы/изображения/

  2. вставить svg.

    SvgPicture.asset('assets/images/password-icon.svg', ширина: 24, высота: 29,2),

Привет , вы можете использовать плагин "flutter_svg": https://pub.dartlang.org/packages/flutter_svg

Просто и легко, а вы можете изменить цвет SVG.

final String assetName = 'assets/up_arrow.svg';
final Widget svgIcon = new SvgPicture.asset(
     assetName,
     color: Colors.red,
     semanticsLabel: 'A red up arrow'
);
Другие вопросы по тегам