Showing
5 changed files
with
55 additions
and
2 deletions
| @@ -31,7 +31,14 @@ import 'widget.dart'; | @@ -31,7 +31,14 @@ import 'widget.dart'; | ||
| 31 | enum DecorationPosition { background, foreground } | 31 | enum DecorationPosition { background, foreground } |
| 32 | 32 | ||
| 33 | @immutable | 33 | @immutable |
| 34 | -class DecorationImage { | 34 | +abstract class DecorationGraphic { |
| 35 | + const DecorationGraphic(); | ||
| 36 | + | ||
| 37 | + void paint(Context context, PdfRect box); | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +@immutable | ||
| 41 | +class DecorationImage extends DecorationGraphic { | ||
| 35 | const DecorationImage({ | 42 | const DecorationImage({ |
| 36 | @required this.image, | 43 | @required this.image, |
| 37 | this.fit = BoxFit.cover, | 44 | this.fit = BoxFit.cover, |
| @@ -46,6 +53,7 @@ class DecorationImage { | @@ -46,6 +53,7 @@ class DecorationImage { | ||
| 46 | final Alignment alignment; | 53 | final Alignment alignment; |
| 47 | final double dpi; | 54 | final double dpi; |
| 48 | 55 | ||
| 56 | + @override | ||
| 49 | void paint(Context context, PdfRect box) { | 57 | void paint(Context context, PdfRect box) { |
| 50 | final _image = image.resolve(context, box.size, dpi: dpi); | 58 | final _image = image.resolve(context, box.size, dpi: dpi); |
| 51 | 59 | ||
| @@ -314,7 +322,7 @@ class BoxDecoration { | @@ -314,7 +322,7 @@ class BoxDecoration { | ||
| 314 | final BoxBorder border; | 322 | final BoxBorder border; |
| 315 | final BorderRadius borderRadius; | 323 | final BorderRadius borderRadius; |
| 316 | final BoxShape shape; | 324 | final BoxShape shape; |
| 317 | - final DecorationImage image; | 325 | + final DecorationGraphic image; |
| 318 | final Gradient gradient; | 326 | final Gradient gradient; |
| 319 | final List<BoxShadow> boxShadow; | 327 | final List<BoxShadow> boxShadow; |
| 320 | 328 |
| @@ -132,3 +132,28 @@ class SvgImage extends Widget { | @@ -132,3 +132,28 @@ class SvgImage extends Widget { | ||
| 132 | context.canvas.restoreContext(); | 132 | context.canvas.restoreContext(); |
| 133 | } | 133 | } |
| 134 | } | 134 | } |
| 135 | + | ||
| 136 | +@immutable | ||
| 137 | +class DecorationSvgImage extends DecorationGraphic { | ||
| 138 | + const DecorationSvgImage({ | ||
| 139 | + @required this.svg, | ||
| 140 | + this.fit = BoxFit.cover, | ||
| 141 | + this.alignment = Alignment.center, | ||
| 142 | + }) : assert(svg != null), | ||
| 143 | + assert(fit != null), | ||
| 144 | + assert(alignment != null); | ||
| 145 | + | ||
| 146 | + final String svg; | ||
| 147 | + final BoxFit fit; | ||
| 148 | + final Alignment alignment; | ||
| 149 | + | ||
| 150 | + @override | ||
| 151 | + void paint(Context context, PdfRect box) { | ||
| 152 | + Widget.draw( | ||
| 153 | + SvgImage(svg: svg, fit: fit, alignment: alignment), | ||
| 154 | + offset: box.offset, | ||
| 155 | + context: context, | ||
| 156 | + constraints: BoxConstraints.tight(box.size), | ||
| 157 | + ); | ||
| 158 | + } | ||
| 159 | +} |
| @@ -176,6 +176,25 @@ void main() { | @@ -176,6 +176,25 @@ void main() { | ||
| 176 | ); | 176 | ); |
| 177 | }); | 177 | }); |
| 178 | 178 | ||
| 179 | + test('SVG Decoration', () { | ||
| 180 | + const svg = | ||
| 181 | + '<?xml version="1.0" encoding="UTF-8"?><svg version="1.1" viewBox="10 20 200 200" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="c" x1="104.74" x2="124.51" y1="139.75" y2="207.77" gradientUnits="userSpaceOnUse"><stop stop-color="#00b11f" offset="0"/><stop stop-color="#b7feb2" offset="1"/></linearGradient><radialGradient id="b" cx="111.9" cy="-15.337" r="109.52" gradientTransform="matrix(-1.3031 .011643 -.009978 -1.1168 257.57 3.3384)" gradientUnits="userSpaceOnUse"><stop stop-color="#2b005f" offset="0"/><stop stop-color="#000d2f" stop-opacity=".96863" offset="1"/></radialGradient><radialGradient id="a" cx="44.694" cy="60.573" r="18.367" gradientTransform="matrix(1.3554 -.02668 .025662 1.3036 -17.437 -17.229)" gradientUnits="userSpaceOnUse"><stop stop-color="#fff" offset="0"/><stop stop-color="#fff" offset=".26769"/><stop offset="1"/></radialGradient></defs><rect x="1.0204" y="15.918" width="219.05" height="137.96" fill="url(#b)"/><path d="m7.3366 145.63c18.171-6.1454 39.144-16.294 58.552-17.914 9.8733-0.82444 17.181 2.9663 26.609 3.7683 6.6883 0.5689 13.518-1.197 20.165-1.628 6.1933-0.40163 12.496 0.51633 18.68 0 14.232-1.1883 28.257-5.7867 41.947-9.5924 4.7147-1.3106 9.3415-3.1133 14.216-3.7037 9.5303-1.1544 17.923 2.038 26.533 2.038l-1.0187 108.26-206.51-4.6042z" fill="url(#c)"/><ellipse cx="49.864" cy="56.735" rx="18.367" ry="18.231" fill="url(#a)"/></svg> '; | ||
| 182 | + | ||
| 183 | + pdf.addPage( | ||
| 184 | + Page( | ||
| 185 | + build: (context) => Container( | ||
| 186 | + decoration: const BoxDecoration( | ||
| 187 | + color: PdfColors.blue100, | ||
| 188 | + image: DecorationSvgImage(svg: svg), | ||
| 189 | + borderRadius: BorderRadius.all(Radius.circular(20)), | ||
| 190 | + ), | ||
| 191 | + padding: const EdgeInsets.all(20), | ||
| 192 | + child: PdfLogo(), | ||
| 193 | + ), | ||
| 194 | + ), | ||
| 195 | + ); | ||
| 196 | + }); | ||
| 197 | + | ||
| 179 | tearDownAll(() async { | 198 | tearDownAll(() async { |
| 180 | final file = File('widgets-svg.pdf'); | 199 | final file = File('widgets-svg.pdf'); |
| 181 | await file.writeAsBytes(await pdf.save()); | 200 | await file.writeAsBytes(await pdf.save()); |
No preview for this file type
-
Please register or login to post a comment