Skip to content

Commit c868125

Browse files
authored
Merge pull request Sub6Resources#915 from tneotia/bugfix/image-reload
Image Fixes
2 parents 816e814 + 08a7350 commit c868125

File tree

2 files changed

+34
-36
lines changed

2 files changed

+34
-36
lines changed

lib/html_parser.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class HtmlParser extends StatelessWidget {
6161
final TextSelectionControls? selectionControls;
6262
final ScrollPhysics? scrollPhysics;
6363

64+
final Map<String, Size> cachedImageSizes = {};
65+
6466
HtmlParser({
6567
required this.key,
6668
required this.htmlData,

lib/image_render.dart

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -109,48 +109,44 @@ ImageRender networkImageRender({
109109
}) =>
110110
(context, attributes, element) {
111111
final src = mapUrl?.call(_src(attributes)) ?? _src(attributes)!;
112-
precacheImage(
113-
NetworkImage(
114-
src,
115-
headers: headers,
116-
),
117-
context.buildContext,
118-
onError: (exception, StackTrace? stackTrace) {
119-
context.parser.onImageError?.call(exception, stackTrace);
120-
},
121-
);
122112
Completer<Size> completer = Completer();
123-
Image image = Image.network(src, frameBuilder: (ctx, child, frame, _) {
124-
if (frame == null) {
113+
if (context.parser.cachedImageSizes[src] != null) {
114+
completer.complete(context.parser.cachedImageSizes[src]);
115+
} else {
116+
Image image = Image.network(src, frameBuilder: (ctx, child, frame, _) {
117+
if (frame == null) {
118+
if (!completer.isCompleted) {
119+
completer.completeError("error");
120+
}
121+
return child;
122+
} else {
123+
return child;
124+
}
125+
});
126+
127+
ImageStreamListener? listener;
128+
listener = ImageStreamListener((ImageInfo imageInfo, bool synchronousCall) {
129+
var myImage = imageInfo.image;
130+
Size size = Size(myImage.width.toDouble(), myImage.height.toDouble());
125131
if (!completer.isCompleted) {
126-
completer.completeError("error");
132+
context.parser.cachedImageSizes[src] = size;
133+
completer.complete(size);
134+
image.image.resolve(ImageConfiguration()).removeListener(listener!);
127135
}
128-
return child;
129-
} else {
130-
return child;
131-
}
132-
});
133-
134-
var listener =
135-
ImageStreamListener((ImageInfo image, bool synchronousCall) {
136-
var myImage = image.image;
137-
Size size = Size(myImage.width.toDouble(), myImage.height.toDouble());
138-
if (!completer.isCompleted) {
139-
completer.complete(size);
140-
}
141-
}, onError: (object, stacktrace) {
142-
if (!completer.isCompleted) {
143-
completer.completeError(object);
144-
}
145-
});
146-
147-
image.image.resolve(ImageConfiguration()).addListener(listener);
136+
}, onError: (object, stacktrace) {
137+
if (!completer.isCompleted) {
138+
completer.completeError(object);
139+
image.image.resolve(ImageConfiguration()).removeListener(listener!);
140+
}
141+
});
142+
143+
image.image.resolve(ImageConfiguration()).addListener(listener);
144+
}
145+
148146
return FutureBuilder<Size>(
149147
future: completer.future,
148+
initialData: context.parser.cachedImageSizes[src],
150149
builder: (BuildContext buildContext, AsyncSnapshot<Size> snapshot) {
151-
if (completer.isCompleted) {
152-
image.image.resolve(ImageConfiguration()).removeListener(listener);
153-
}
154150
if (snapshot.hasData) {
155151
return Container(
156152
constraints: BoxConstraints(

0 commit comments

Comments
 (0)