Fix error resolution when a completer is already set (#81014)

This commit is contained in:
Dan Field 2021-04-22 19:49:03 -07:00 committed by GitHub
parent 7b0c82676e
commit 08ca8b01bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 23 deletions

View File

@ -333,8 +333,6 @@ abstract class ImageProvider<T extends Object> {
},
(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<T extends Object> {
};
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 {

View File

@ -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,

View File

@ -90,7 +90,9 @@ void main() {
await testZone.run(() async {
final ImageProvider imageProvider = LoadErrorCompleterImageProvider();
final Completer<bool> caughtError = Completer<bool>();
final Completer<bool> onErrorCompleter = Completer<bool>();
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);
});