|  | // 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 'package:flutter/material.dart'; | 
|  | import 'package:flutter_driver/driver_extension.dart'; | 
|  |  | 
|  | /// This sample application creates a hard to render frame, causing the | 
|  | /// driver script to race the raster thread. If the driver script wins the | 
|  | /// race, it will screenshot the previous frame. If the raster thread wins | 
|  | /// it, it will screenshot the latest frame. | 
|  | void main() { | 
|  | enableFlutterDriverExtension(); | 
|  |  | 
|  | runApp(const Toggler()); | 
|  | } | 
|  |  | 
|  | class Toggler extends StatefulWidget { | 
|  | const Toggler({super.key}); | 
|  |  | 
|  | @override | 
|  | State<Toggler> createState() => TogglerState(); | 
|  | } | 
|  |  | 
|  | class TogglerState extends State<Toggler> { | 
|  | bool _visible = false; | 
|  |  | 
|  | @override | 
|  | Widget build(BuildContext context) { | 
|  | return MaterialApp( | 
|  | home: Scaffold( | 
|  | appBar: AppBar( | 
|  | title: const Text('FlutterDriver test'), | 
|  | ), | 
|  | body: Material( | 
|  | child: Column( | 
|  | children: <Widget>[ | 
|  | TextButton( | 
|  | key: const ValueKey<String>('toggle'), | 
|  | child: const Text('Toggle visibility'), | 
|  | onPressed: () { | 
|  | setState(() { | 
|  | _visible = !_visible; | 
|  | }); | 
|  | }, | 
|  | ), | 
|  | Expanded( | 
|  | child: ListView( | 
|  | children: _buildRows(_visible ? 10 : 0), | 
|  | ), | 
|  | ), | 
|  | ], | 
|  | ), | 
|  | ), | 
|  | ), | 
|  | ); | 
|  | } | 
|  | } | 
|  |  | 
|  | List<Widget> _buildRows(int count) { | 
|  | return List<Widget>.generate(count, (int i) { | 
|  | return Row( | 
|  | children: _buildCells(i / count), | 
|  | ); | 
|  | }); | 
|  | } | 
|  |  | 
|  | /// Builds cells that are known to take time to render causing a delay on the | 
|  | /// raster thread. | 
|  | List<Widget> _buildCells(double epsilon) { | 
|  | return List<Widget>.generate(15, (int i) { | 
|  | return Expanded( | 
|  | child: Material( | 
|  | // A magic color that the test will be looking for on the screenshot. | 
|  | color: const Color(0xffff0102), | 
|  | borderRadius: BorderRadius.all(Radius.circular(i.toDouble() + epsilon)), | 
|  | elevation: 5.0, | 
|  | child: const SizedBox(height: 10.0, width: 10.0), | 
|  | ), | 
|  | ); | 
|  | }); | 
|  | } |