From bcf23ed45b1e5f7afcf9b4ac1e96dc73784f9f23 Mon Sep 17 00:00:00 2001 From: suojae Date: Sun, 22 Feb 2026 14:54:43 +0900 Subject: [PATCH 1/4] feat(vector_graphics): add imageBuilder property to VectorGraphic Adds an optional imageBuilder callback that wraps the loaded vector graphic widget, enabling post-load decoration such as borders or gesture detectors without affecting placeholder or error states. Resolves flutter/flutter#182635 --- packages/vector_graphics/CHANGELOG.md | 3 +- .../lib/src/vector_graphics.dart | 20 ++++++ .../lib/vector_graphics_compat.dart | 1 + packages/vector_graphics/pubspec.yaml | 2 +- .../test/vector_graphics_test.dart | 64 +++++++++++++++++++ 5 files changed, 88 insertions(+), 2 deletions(-) diff --git a/packages/vector_graphics/CHANGELOG.md b/packages/vector_graphics/CHANGELOG.md index f73be2f06999..975f768f7a58 100644 --- a/packages/vector_graphics/CHANGELOG.md +++ b/packages/vector_graphics/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 1.1.20 * Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. +* Adds `imageBuilder` property to `VectorGraphic` for wrapping the loaded vector graphic widget. ## 1.1.19 diff --git a/packages/vector_graphics/lib/src/vector_graphics.dart b/packages/vector_graphics/lib/src/vector_graphics.dart index c5a550a6959d..8a5c6038e414 100644 --- a/packages/vector_graphics/lib/src/vector_graphics.dart +++ b/packages/vector_graphics/lib/src/vector_graphics.dart @@ -47,6 +47,11 @@ enum RenderingStrategy { typedef VectorGraphicsErrorWidget = Widget Function(BuildContext context, Object error, StackTrace stackTrace); +/// The signature that [VectorGraphic.imageBuilder] uses to wrap the +/// successfully loaded vector graphic widget. +typedef VectorGraphicsImageWidget = + Widget Function(BuildContext context, Widget child); + /// A vector graphic/flutter_svg compatibility shim. VectorGraphic createCompatVectorGraphic({ Key? key, @@ -61,6 +66,7 @@ VectorGraphic createCompatVectorGraphic({ Duration? transitionDuration, WidgetBuilder? placeholderBuilder, VectorGraphicsErrorWidget? errorBuilder, + VectorGraphicsImageWidget? imageBuilder, ColorFilter? colorFilter, Animation? opacity, RenderingStrategy strategy = RenderingStrategy.picture, @@ -80,6 +86,7 @@ VectorGraphic createCompatVectorGraphic({ transitionDuration: transitionDuration, placeholderBuilder: placeholderBuilder, errorBuilder: errorBuilder, + imageBuilder: imageBuilder, colorFilter: colorFilter, opacity: opacity, strategy: strategy, @@ -120,6 +127,7 @@ class VectorGraphic extends StatefulWidget { this.transitionDuration, this.placeholderBuilder, this.errorBuilder, + this.imageBuilder, this.colorFilter, this.opacity, this.clipViewbox = true, @@ -140,6 +148,7 @@ class VectorGraphic extends StatefulWidget { this.transitionDuration, this.placeholderBuilder, this.errorBuilder, + this.imageBuilder, this.colorFilter, this.opacity, this.strategy = RenderingStrategy.picture, @@ -219,6 +228,13 @@ class VectorGraphic extends StatefulWidget { /// A callback that fires if some exception happens during data acquisition or decoding. final VectorGraphicsErrorWidget? errorBuilder; + /// A builder that wraps the successfully loaded vector graphic widget. + /// + /// This builder is only called when the vector graphic has been successfully + /// loaded and is ready to be painted. It can be used to apply decorations + /// such as borders or shadows only when the image is available. + final VectorGraphicsImageWidget? imageBuilder; + /// Set transition duration while switching from placeholder to url image final Duration? transitionDuration; @@ -517,6 +533,10 @@ class _VectorGraphicWidgetState extends State { child: SizedBox.fromSize(size: pictureInfo.size, child: child), ), ); + + if (widget.imageBuilder != null) { + child = widget.imageBuilder!(context, child); + } } else if (_error != null && widget.errorBuilder != null) { child = widget.errorBuilder!( context, diff --git a/packages/vector_graphics/lib/vector_graphics_compat.dart b/packages/vector_graphics/lib/vector_graphics_compat.dart index 95d9f7f660ef..ba56f7d3fd8e 100644 --- a/packages/vector_graphics/lib/vector_graphics_compat.dart +++ b/packages/vector_graphics/lib/vector_graphics_compat.dart @@ -11,5 +11,6 @@ export 'src/vector_graphics.dart' RenderingStrategy, VectorGraphic, VectorGraphicUtilities, + VectorGraphicsImageWidget, createCompatVectorGraphic, vg; diff --git a/packages/vector_graphics/pubspec.yaml b/packages/vector_graphics/pubspec.yaml index 83cbab6a1f37..25abea4eeabf 100644 --- a/packages/vector_graphics/pubspec.yaml +++ b/packages/vector_graphics/pubspec.yaml @@ -2,7 +2,7 @@ name: vector_graphics description: A vector graphics rendering package for Flutter using a binary encoding. repository: https://github.com/flutter/packages/tree/main/packages/vector_graphics issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+vector_graphics%22 -version: 1.1.19 +version: 1.1.20 environment: sdk: ^3.9.0 diff --git a/packages/vector_graphics/test/vector_graphics_test.dart b/packages/vector_graphics/test/vector_graphics_test.dart index b046ad3a4955..0b4d82d3650d 100644 --- a/packages/vector_graphics/test/vector_graphics_test.dart +++ b/packages/vector_graphics/test/vector_graphics_test.dart @@ -690,6 +690,70 @@ void main() { expect(matrix.row1.y, 1); }); + testWidgets('imageBuilder wraps the loaded vector graphic', ( + WidgetTester tester, + ) async { + final buffer = VectorGraphicsBuffer(); + codec.writeSize(buffer, 100, 200); + final ByteData data = buffer.done(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: VectorGraphic( + loader: TestBytesLoader(data), + imageBuilder: (BuildContext context, Widget child) { + return Container( + key: const ValueKey('image-builder'), + child: child, + ); + }, + ), + ), + ); + await tester.pumpAndSettle(); + + expect(find.byKey(const ValueKey('image-builder')), findsOneWidget); + }); + + testWidgets('imageBuilder is not called during placeholder state', ( + WidgetTester tester, + ) async { + final completer = Completer(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: VectorGraphic( + loader: DelayedBytesLoader(completer.future), + imageBuilder: (BuildContext context, Widget child) { + return Container( + key: const ValueKey('image-builder'), + child: child, + ); + }, + placeholderBuilder: (BuildContext context) { + return Container(key: const ValueKey('placeholder')); + }, + ), + ), + ); + + // During loading: placeholder visible, imageBuilder not called + expect(find.byKey(const ValueKey('placeholder')), findsOneWidget); + expect(find.byKey(const ValueKey('image-builder')), findsNothing); + + // Complete loading + final buffer = VectorGraphicsBuffer(); + codec.writeSize(buffer, 100, 200); + completer.complete(buffer.done()); + await tester.pumpAndSettle(); + + // After loading: imageBuilder visible, placeholder gone + expect(find.byKey(const ValueKey('image-builder')), findsOneWidget); + expect(find.byKey(const ValueKey('placeholder')), findsNothing); + }); + testWidgets('VectorGraphicsWidget can handle errors from bytes loader', ( WidgetTester tester, ) async { From 24f6f801a4443eb8f01406d7d21c894b0d0229d3 Mon Sep 17 00:00:00 2001 From: suojae Date: Wed, 11 Mar 2026 13:24:51 +0900 Subject: [PATCH 2/4] bump version to 1.2.0 for new feature (minor) --- packages/vector_graphics/CHANGELOG.md | 2 +- packages/vector_graphics/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vector_graphics/CHANGELOG.md b/packages/vector_graphics/CHANGELOG.md index 975f768f7a58..73449ea4d735 100644 --- a/packages/vector_graphics/CHANGELOG.md +++ b/packages/vector_graphics/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.1.20 +## 1.2.0 * Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. * Adds `imageBuilder` property to `VectorGraphic` for wrapping the loaded vector graphic widget. diff --git a/packages/vector_graphics/pubspec.yaml b/packages/vector_graphics/pubspec.yaml index 25abea4eeabf..e4699cba72ed 100644 --- a/packages/vector_graphics/pubspec.yaml +++ b/packages/vector_graphics/pubspec.yaml @@ -2,7 +2,7 @@ name: vector_graphics description: A vector graphics rendering package for Flutter using a binary encoding. repository: https://github.com/flutter/packages/tree/main/packages/vector_graphics issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+vector_graphics%22 -version: 1.1.20 +version: 1.2.0 environment: sdk: ^3.9.0 From 3022801301706d968865a08ba9a85e6cda5045e5 Mon Sep 17 00:00:00 2001 From: suojae Date: Mon, 6 Apr 2026 22:47:47 +0900 Subject: [PATCH 3/4] Fix imageBuilder release metadata --- packages/vector_graphics/CHANGELOG.md | 9 ++++++++- third_party/packages/flutter_svg/CHANGELOG.md | 4 ++++ third_party/packages/flutter_svg/pubspec.yaml | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/vector_graphics/CHANGELOG.md b/packages/vector_graphics/CHANGELOG.md index 258cc349bc2e..962000513c6d 100644 --- a/packages/vector_graphics/CHANGELOG.md +++ b/packages/vector_graphics/CHANGELOG.md @@ -1,8 +1,15 @@ ## 1.2.0 +* Adds `imageBuilder` property to `VectorGraphic` for wrapping the loaded vector graphic widget. + +## 1.1.21 + +* Corrected width/height parameter documentation in VectorGraphic widget. + +## 1.1.20 + * Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. * Respect BoxFit parameter when viewbox is specified. -* Adds `imageBuilder` property to `VectorGraphic` for wrapping the loaded vector graphic widget. ## 1.1.19 diff --git a/third_party/packages/flutter_svg/CHANGELOG.md b/third_party/packages/flutter_svg/CHANGELOG.md index 72f941829e55..c5a5969e785e 100644 --- a/third_party/packages/flutter_svg/CHANGELOG.md +++ b/third_party/packages/flutter_svg/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.0 + +* Adds `imageBuilder` property to `SvgPicture` for wrapping the loaded SVG widget. + ## 2.2.4 * Updates README with example to scale SVG without losing quality diff --git a/third_party/packages/flutter_svg/pubspec.yaml b/third_party/packages/flutter_svg/pubspec.yaml index 60d9d19d4e01..f6300db9821e 100644 --- a/third_party/packages/flutter_svg/pubspec.yaml +++ b/third_party/packages/flutter_svg/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_svg description: An SVG rendering and widget library for Flutter, which allows painting and displaying Scalable Vector Graphics 1.1 files. repository: https://github.com/flutter/packages/tree/main/third_party/packages/flutter_svg issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_svg%22 -version: 2.2.4 +version: 2.3.0 environment: sdk: ^3.9.0 @@ -12,7 +12,7 @@ dependencies: flutter: sdk: flutter http: ^1.0.0 - vector_graphics: ^1.1.13 + vector_graphics: ^1.2.0 vector_graphics_codec: ^1.1.11+1 vector_graphics_compiler: ^1.1.14 From 69b44538662d30c8ca642778b010c6641be9947a Mon Sep 17 00:00:00 2001 From: suojae Date: Mon, 6 Apr 2026 22:51:50 +0900 Subject: [PATCH 4/4] Revert flutter_svg release metadata --- third_party/packages/flutter_svg/CHANGELOG.md | 4 ---- third_party/packages/flutter_svg/pubspec.yaml | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/third_party/packages/flutter_svg/CHANGELOG.md b/third_party/packages/flutter_svg/CHANGELOG.md index c5a5969e785e..72f941829e55 100644 --- a/third_party/packages/flutter_svg/CHANGELOG.md +++ b/third_party/packages/flutter_svg/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.3.0 - -* Adds `imageBuilder` property to `SvgPicture` for wrapping the loaded SVG widget. - ## 2.2.4 * Updates README with example to scale SVG without losing quality diff --git a/third_party/packages/flutter_svg/pubspec.yaml b/third_party/packages/flutter_svg/pubspec.yaml index f6300db9821e..60d9d19d4e01 100644 --- a/third_party/packages/flutter_svg/pubspec.yaml +++ b/third_party/packages/flutter_svg/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_svg description: An SVG rendering and widget library for Flutter, which allows painting and displaying Scalable Vector Graphics 1.1 files. repository: https://github.com/flutter/packages/tree/main/third_party/packages/flutter_svg issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_svg%22 -version: 2.3.0 +version: 2.2.4 environment: sdk: ^3.9.0 @@ -12,7 +12,7 @@ dependencies: flutter: sdk: flutter http: ^1.0.0 - vector_graphics: ^1.2.0 + vector_graphics: ^1.1.13 vector_graphics_codec: ^1.1.11+1 vector_graphics_compiler: ^1.1.14