From 08ca8b01bc9dc87a8e4137536f5781ddf0363dc1 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 22 Apr 2021 19:49:03 -0700 Subject: [PATCH] Fix error resolution when a completer is already set (#81014) --- .../lib/src/painting/image_provider.dart | 27 ++++--------------- .../lib/src/painting/image_stream.dart | 1 - .../test/painting/image_provider_test.dart | 3 +++ 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/packages/flutter/lib/src/painting/image_provider.dart b/packages/flutter/lib/src/painting/image_provider.dart index cb750d26c0f..61f63fa8a9f 100644 --- a/packages/flutter/lib/src/painting/image_provider.dart +++ b/packages/flutter/lib/src/painting/image_provider.dart @@ -333,8 +333,6 @@ abstract class ImageProvider { }, (T? key, Object exception, StackTrace? stack) async { await null; // wait an event turn in case a listener has been added to the image stream. - final _ErrorImageCompleter imageCompleter = _ErrorImageCompleter(); - stream.setCompleter(imageCompleter); InformationCollector? collector; assert(() { collector = () sync* { @@ -344,7 +342,10 @@ abstract class ImageProvider { }; return true; }()); - imageCompleter.setError( + if (stream.completer == null) { + stream.setCompleter(_ErrorImageCompleter()); + } + stream.completer!.reportError( exception: exception, stack: stack, context: ErrorDescription('while resolving an image'), @@ -1127,25 +1128,7 @@ class ExactAssetImage extends AssetBundleImageProvider { } // A completer used when resolving an image fails sync. -class _ErrorImageCompleter extends ImageStreamCompleter { - _ErrorImageCompleter(); - - void setError({ - DiagnosticsNode? context, - required Object exception, - StackTrace? stack, - InformationCollector? informationCollector, - bool silent = false, - }) { - reportError( - context: context, - exception: exception, - stack: stack, - informationCollector: informationCollector, - silent: silent, - ); - } -} +class _ErrorImageCompleter extends ImageStreamCompleter {} /// The exception thrown when the HTTP request to load a network image fails. class NetworkImageLoadException implements Exception { diff --git a/packages/flutter/lib/src/painting/image_stream.dart b/packages/flutter/lib/src/painting/image_stream.dart index 5d2ebf8cacd..a0b27b7e0bf 100644 --- a/packages/flutter/lib/src/painting/image_stream.dart +++ b/packages/flutter/lib/src/painting/image_stream.dart @@ -668,7 +668,6 @@ abstract class ImageStreamCompleter with Diagnosticable { /// messages, but errors during development will still be reported. /// /// See [FlutterErrorDetails] for further details on these values. - @protected @pragma('vm:notify-debugger-on-exception') void reportError({ DiagnosticsNode? context, diff --git a/packages/flutter/test/painting/image_provider_test.dart b/packages/flutter/test/painting/image_provider_test.dart index 3249a03cedf..28b317185ba 100644 --- a/packages/flutter/test/painting/image_provider_test.dart +++ b/packages/flutter/test/painting/image_provider_test.dart @@ -90,7 +90,9 @@ void main() { await testZone.run(() async { final ImageProvider imageProvider = LoadErrorCompleterImageProvider(); final Completer caughtError = Completer(); + final Completer onErrorCompleter = Completer(); FlutterError.onError = (FlutterErrorDetails details) { + onErrorCompleter.complete(true); throw Error(); }; final ImageStream result = imageProvider.resolve(ImageConfiguration.empty); @@ -99,6 +101,7 @@ void main() { caughtError.complete(true); })); expect(await caughtError.future, true); + expect(await onErrorCompleter.future, true); }); expect(uncaught, false); });