Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 165cb0b

Browse files
authored
fixes FadeInImage for an edge case (#111035)
1 parent 16a0771 commit 165cb0b

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

packages/flutter/lib/src/widgets/fade_in_image.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,8 @@ class _AnimatedFadeOutFadeInState extends ImplicitlyAnimatedWidgetState<_Animate
562562

563563
@override
564564
Widget build(BuildContext context) {
565-
if (widget.wasSynchronouslyLoaded || _placeholderOpacityAnimation!.isCompleted) {
565+
if (widget.wasSynchronouslyLoaded ||
566+
(_placeholderOpacityAnimation?.isCompleted ?? true)) {
566567
return widget.target;
567568
}
568569

packages/flutter/test/widgets/fade_in_image_test.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,44 @@ Future<void> main() async {
199199
expect(parts.target.opacity, 1);
200200
});
201201

202+
// Regression test for https://github.com/flutter/flutter/issues/111011
203+
testWidgets("FadeInImage's image obeys gapless playback when first image is cached but second isn't",
204+
(WidgetTester tester) async {
205+
final TestImageProvider placeholderProvider = TestImageProvider(placeholderImage);
206+
final TestImageProvider imageProvider = TestImageProvider(targetImage);
207+
final TestImageProvider secondImageProvider = TestImageProvider(replacementImage);
208+
209+
// Pre-cache the initial image.
210+
imageProvider.resolve(ImageConfiguration.empty);
211+
imageProvider.complete();
212+
placeholderProvider.complete();
213+
214+
await tester.pumpWidget(FadeInImage(
215+
placeholder: placeholderProvider,
216+
image: imageProvider,
217+
));
218+
await tester.pumpAndSettle();
219+
220+
await tester.pumpWidget(FadeInImage(
221+
placeholder: placeholderProvider,
222+
image: secondImageProvider,
223+
));
224+
225+
FadeInImageParts parts = findFadeInImage(tester);
226+
// Continually shows previously loaded image until the new image provider provides the image.
227+
expect(parts.placeholder, isNull);
228+
expect(parts.target.rawImage.image!.isCloneOf(targetImage), isTrue);
229+
expect(parts.target.opacity, 1);
230+
231+
// Now, provide the image.
232+
secondImageProvider.complete();
233+
await tester.pump();
234+
235+
parts = findFadeInImage(tester);
236+
expect(parts.target.rawImage.image!.isCloneOf(replacementImage), isTrue);
237+
expect(parts.target.opacity, 1);
238+
});
239+
202240
testWidgets("FadeInImage's placeholder obeys gapless playback", (WidgetTester tester) async {
203241
final TestImageProvider placeholderProvider = TestImageProvider(placeholderImage);
204242
final TestImageProvider secondPlaceholderProvider = TestImageProvider(replacementImage);

0 commit comments

Comments
 (0)