| // 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), | |
| ), | |
| ); | |
| }); | |
| } |