@@ -11,10 +11,15 @@ typedef ImageSourceMatcher = bool Function(
1111 dom.Element ? element,
1212);
1313
14- ImageSourceMatcher base64DataUriMatcher () => (attributes, element) =>
15- _src (attributes) != null &&
16- _src (attributes)! .startsWith ("data:image" ) &&
17- _src (attributes)! .contains ("base64," );
14+ final _dataUriFormat = RegExp ("^(?<scheme>data):(?<mime>image\/ [\\ w\+\-\. ]+)(?<encoding>;base64)?\, (?<data>.*)" );
15+
16+ ImageSourceMatcher dataUriMatcher ({String ? encoding = 'base64' , String ? mime}) => (attributes, element) {
17+ if (_src (attributes) == null ) return false ;
18+ final dataUri = _dataUriFormat.firstMatch (_src (attributes)! );
19+ return dataUri != null &&
20+ (mime == null || dataUri.namedGroup ('mime' ) == mime) &&
21+ (encoding == null || dataUri.namedGroup ('encoding' ) == ';$encoding ' );
22+ };
1823
1924ImageSourceMatcher networkSourceMatcher ({
2025 List <String > schemas: const ["https" , "http" ],
@@ -56,8 +61,7 @@ ImageRender base64ImageRender() => (context, attributes, element) {
5661 decodedImage,
5762 frameBuilder: (ctx, child, frame, _) {
5863 if (frame == null ) {
59- return Text (_alt (attributes) ?? "" ,
60- style: context.style.generateTextStyle ());
64+ return Text (_alt (attributes) ?? "" , style: context.style.generateTextStyle ());
6165 }
6266 return child;
6367 },
@@ -79,8 +83,7 @@ ImageRender assetImageRender({
7983 height: height ?? _height (attributes),
8084 frameBuilder: (ctx, child, frame, _) {
8185 if (frame == null ) {
82- return Text (_alt (attributes) ?? "" ,
83- style: context.style.generateTextStyle ());
86+ return Text (_alt (attributes) ?? "" , style: context.style.generateTextStyle ());
8487 }
8588 return child;
8689 },
@@ -109,8 +112,7 @@ ImageRender networkImageRender({
109112 },
110113 );
111114 Completer <Size > completer = Completer ();
112- Image image =
113- Image .network (src, frameBuilder: (ctx, child, frame, _) {
115+ Image image = Image .network (src, frameBuilder: (ctx, child, frame, _) {
114116 if (frame == null ) {
115117 if (! completer.isCompleted) {
116118 completer.completeError ("error" );
@@ -124,8 +126,7 @@ ImageRender networkImageRender({
124126 image.image.resolve (ImageConfiguration ()).addListener (
125127 ImageStreamListener ((ImageInfo image, bool synchronousCall) {
126128 var myImage = image.image;
127- Size size =
128- Size (myImage.width.toDouble (), myImage.height.toDouble ());
129+ Size size = Size (myImage.width.toDouble (), myImage.height.toDouble ());
129130 if (! completer.isCompleted) {
130131 completer.complete (size);
131132 }
@@ -147,28 +148,47 @@ ImageRender networkImageRender({
147148 frameBuilder: (ctx, child, frame, _) {
148149 if (frame == null ) {
149150 return altWidget? .call (_alt (attributes)) ??
150- Text (_alt (attributes) ?? "" ,
151- style: context.style.generateTextStyle ());
151+ Text (_alt (attributes) ?? "" , style: context.style.generateTextStyle ());
152152 }
153153 return child;
154154 },
155155 );
156156 } else if (snapshot.hasError) {
157- return altWidget? .call (_alt (attributes)) ?? Text ( _alt (attributes) ?? "" ,
158- style: context.style.generateTextStyle ());
157+ return altWidget? .call (_alt (attributes)) ??
158+ Text ( _alt (attributes) ?? "" , style: context.style.generateTextStyle ());
159159 } else {
160160 return loadingWidget? .call () ?? const CircularProgressIndicator ();
161161 }
162162 },
163163 );
164164 };
165165
166+ ImageRender svgDataImageRender () => (context, attributes, element) {
167+ final dataUri = _dataUriFormat.firstMatch (_src (attributes)! );
168+ final data = dataUri? .namedGroup ('data' );
169+ if (data == null ) return null ;
170+ if (dataUri? .namedGroup ('encoding' ) == ';base64' ) {
171+ final decodedImage = base64.decode (data.trim ());
172+ return SvgPicture .memory (
173+ decodedImage,
174+ width: _width (attributes),
175+ height: _height (attributes),
176+ );
177+ }
178+ return SvgPicture .string (Uri .decodeFull (data));
179+ };
180+
166181ImageRender svgNetworkImageRender () => (context, attributes, element) {
167- return SvgPicture .network (_src (attributes)! );
182+ return SvgPicture .network (
183+ attributes["src" ]! ,
184+ width: _width (attributes),
185+ height: _height (attributes),
186+ );
168187 };
169188
170189final Map <ImageSourceMatcher , ImageRender > defaultImageRenders = {
171- base64DataUriMatcher (): base64ImageRender (),
190+ dataUriMatcher (mime: 'image/svg+xml' , encoding: null ): svgDataImageRender (),
191+ dataUriMatcher (): base64ImageRender (),
172192 assetUriMatcher (): assetImageRender (),
173193 networkSourceMatcher (extension : "svg" ): svgNetworkImageRender (),
174194 networkSourceMatcher (): networkImageRender (),
0 commit comments