Skip to content

Commit eebbb0e

Browse files
fixes FadeInImage for an edge case (flutter#111035) (flutter#113035)
Co-authored-by: Viren Khatri <[email protected]>
1 parent b7a0f2b commit eebbb0e

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
@@ -539,7 +539,8 @@ class _AnimatedFadeOutFadeInState extends ImplicitlyAnimatedWidgetState<_Animate
539539

540540
@override
541541
Widget build(BuildContext context) {
542-
if (widget.wasSynchronouslyLoaded || _placeholderOpacityAnimation!.isCompleted) {
542+
if (widget.wasSynchronouslyLoaded ||
543+
(_placeholderOpacityAnimation?.isCompleted ?? true)) {
543544
return widget.target;
544545
}
545546

packages/flutter/test/widgets/fade_in_image_test.dart

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

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

0 commit comments

Comments
 (0)