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