blob: 1208eb1e528f200c564bb92aa85b3cf30aec495f [file] [log] [blame]
// 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;
}
}