// 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 'package:flutter/material.dart'; import 'package:flutter/services.dart'; final Completer<void> _assetImageCompleter = Completer<void>(); final Completer<void> _networkImageCompleter = Completer<void>(); /// Notifies that Image.asset used in the test app loaded the image. Future<void> get whenAssetImageLoads => _assetImageCompleter.future; /// Notifies that Image.network used in the test app loaded the image. Future<void> get whenNetworkImageLoads => _networkImageCompleter.future; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); const MethodChannel channel = OptionalMethodChannel('flutter/web_test_e2e', JSONMethodCodec()); // Artificially override the device pixel ratio to force the framework to pick the 1.5x asset variants. await channel.invokeMethod<void>('setDevicePixelRatio', '1.5'); runApp(const MyApp()); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override MyAppState createState() => MyAppState(); } class MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return MaterialApp( key: const Key('mainapp'), title: 'Integration Test App', home: Column(children: <Widget>[ const Text('Asset image:'), RepaintBoundary(child: Image.asset( 'assets/icons/material/material.png', package: 'flutter_gallery_assets', frameBuilder: ( BuildContext context, Widget child, int? frame, bool wasSynchronouslyLoaded, ) { if (frame != null) { _assetImageCompleter.complete(); } return child; }, )), const Text('Network image:'), RepaintBoundary(child: Image.network( 'assets/packages/flutter_gallery_assets/assets/icons/material/material.png', frameBuilder: ( BuildContext context, Widget child, int? frame, bool wasSynchronouslyLoaded, ) { if (frame != null) { _networkImageCompleter.complete(); } return child; }, )), ]) ); } }