【问题标题】:Display a svg from a String in Flutter/Dart在 Flutter/Dart 中显示来自字符串的 svg
【发布时间】:2019-03-19 12:39:28
【问题描述】:

我正在尝试将 svg 字符串中的图像显示到屏幕上。

我正在使用:https://pub.dartlang.org/packages/flutter_svg 来支持 svg。

final String svgAsString = '''<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="109" height="109" viewBox="0 
0 109 109">
<g id="kvg:StrokePaths_080a1" style="fill:none;stroke:#000000;stroke- 
width:3;stroke-linecap:round;stroke-linejoin:round;">
<path id="kvg:080a1-s1" 
d="M20.22,18.74c0.77,0.77,0.79,2.14,0.8,3.05C21.38,62,20.62,75,11.5,89.39"/>
</g>
</svg>''';

我无法将此渲染到图像小部件或绘制到画布上。两种方法我都试过了,都没有成功。

我将在下面粘贴完整代码:我不确定我是否在正确的轨道上。

import 'dart:async';
import 'dart:ui';

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

 class KanjiGradeGenerator extends StatefulWidget {
     @override
     _KanjiGradeState createState() => _KanjiGradeState();
 }

 class _KanjiGradeState extends State<KanjiGradeGenerator> {

 _KanjiGradeState() {}

displaySVG() async {

<g id="kvg:StrokePaths_080a1" style="fill:none;stroke:#000000;stroke- 
width:3;stroke-linecap:round;stroke-linejoin:round;">
<path id="kvg:080a1-s1" 
d="M20.22,18.74c0.77,0.77,0.79,2.14,0.8,3.05C21.38,62,20.62,75,11.5,89.39"/>
</g>
</svg>''';

final DrawableRoot svgRoot = await svg.fromSvgString(rawSvg, rawSvg);

final Picture picture = svgRoot.toPicture();

PictureRecorder picRec;
Canvas can = Canvas(picRec);

setState(() {
  can.drawPicture(picture);
});
}

Widget build(BuildContext context) {
    return new Scaffold(
      body: Container(
        child: displaySVG()
      ),
    );
 }
}

我收到的错误是:

I/flutter (7791):“未来”类型不是“小部件”类型的子类型

【问题讨论】:

    标签: svg dart flutter


    【解决方案1】:

    尽管documentation 建议这样做:

    final DrawableRoot svgRoot = await svg.fromSvgString(rawSvg, rawSvg);

    我发现您在将其转换为 Widget 时会遇到困难。

    如果您的图像字符串是从 Base64 编码/解码的,那么您可以使用 this

    一旦你有了一个字符串,你就可以这样做:

    import 'package:flutter_svg/flutter_svg.dart';
    
    String decoded; // Decoded image
    
    @override
    Widget build(BuildContext context) {
        return new Scaffold(
          body: Container(
            child: SvgPicture.string(decoded)
          ),
        );
     }
    

    【讨论】:

      【解决方案2】:

      您可以使用FutureBuilder 小部件来显示图像。

      class KanjiGradeGenerator extends StatefulWidget {
        @override
        _KanjiGradeGeneratorState createState() => _KanjiGradeGeneratorState();
      }
      
      class _KanjiGradeGeneratorState extends State<KanjiGradeGenerator> {
        final rawSvg = 'YOUR_PATH';
      
        displaySvg() async {
          final DrawableRoot svgRoot = await svg.fromSvgString(rawSvg, rawSvg);
          return await svgRoot.toPicture().toImage(500, 500);
        }
        @override
        Widget build(BuildContext context) {
          return FutureBuilder(
            future: displaySvg(),
            builder: (context,snapshot){
              return Container(
                child: snapshot.data,
              );
            },
          );
        }
      }
      

      【讨论】:

      • 这可能会奏效,尽管您可能最好只使用SvgPicture.string(),它会为您抽象出很多内容。
      • 这不起作用。 dart:ui:Image 不是小部件。
      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2017-05-28
      • 2013-04-23
      • 1970-01-01
      相关资源
      最近更新 更多