// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:mockito/mockito.dart'; void main() { final ThrowingHttpClient httpClient = ThrowingHttpClient(); final HttpOverrides overrides = ProvidedHttpOverrides(httpClient); HttpOverrides.global = overrides; final ZoneSpecification specification = ZoneSpecification( handleUncaughtError:(Zone zone, ZoneDelegate delegate, Zone parent, Object error, StackTrace stackTrace) { FlutterError.reportError(FlutterErrorDetails( exception: error, context: ErrorDescription('In the Zone handleUncaughtError handler'), silent: false, )); }); when(httpClient.getUrl(any)).thenAnswer((Invocation invocation) { final Completer<HttpClientRequest> completer = Completer<HttpClientRequest>.sync(); completer.completeError(Error()); return completer.future; }); Zone.current.fork(specification: specification).run<void>(() { runApp(ImageLoader()); }); } class ImageLoader extends StatefulWidget { @override _ImageLoaderState createState() => _ImageLoaderState(); } class _ImageLoaderState extends State<ImageLoader> { bool caughtError = false; @override void initState() { // This is not an image, but we don't care since we're using a faked // http client. const NetworkImage image = NetworkImage('https://github.com/flutter/flutter'); final ImageStream stream = image.resolve(ImageConfiguration.empty); ImageStreamListener listener; listener = ImageStreamListener( (ImageInfo info, bool syncCall) { stream.removeListener(listener); }, onError: (dynamic error, StackTrace stackTrace) { print('ERROR caught by framework'); stream.removeListener(listener); }, ); stream.addListener(listener); super.initState(); } @override Widget build(BuildContext context) { return const Text('hello', textDirection: TextDirection.ltr); } } class ThrowingHttpClient extends Mock implements HttpClient {} class ProvidedHttpOverrides extends HttpOverrides { ProvidedHttpOverrides(this.httpClient); final ThrowingHttpClient httpClient; @override HttpClient createHttpClient(SecurityContext context) { return httpClient; } }