| // 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'; | |
| class CullOpacityPage extends StatefulWidget { | |
| const CullOpacityPage({super.key}); | |
| @override | |
| State<StatefulWidget> createState() => _CullOpacityPageState(); | |
| } | |
| class _CullOpacityPageState extends State<CullOpacityPage> with SingleTickerProviderStateMixin { | |
| late Animation<double> _offsetY; | |
| late AnimationController _controller; | |
| @override | |
| void initState() { | |
| super.initState(); | |
| _controller = AnimationController(vsync: this, duration: const Duration(seconds: 2)); | |
| // Animations are typically implemented using the AnimatedBuilder widget. | |
| // This code uses a manual listener for historical reasons and will remain | |
| // in order to preserve compatibility with the history of measurements for | |
| // this benchmark. | |
| _offsetY = Tween<double>(begin: 0, end: -1000.0).animate(_controller) | |
| ..addListener(() { | |
| setState(() {}); | |
| }); | |
| _controller.repeat(); | |
| } | |
| @override | |
| void dispose() { | |
| _controller.dispose(); | |
| super.dispose(); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| return Stack( | |
| children: List<Widget>.generate( | |
| 50, | |
| (int i) => Positioned( | |
| left: 0, | |
| top: (200 * i).toDouble() + _offsetY.value, | |
| child: Opacity( | |
| opacity: 0.5, | |
| child: RepaintBoundary( | |
| child: Container( | |
| // Slightly change width to invalidate raster cache. | |
| width: 1000 - (_offsetY.value / 100), | |
| height: 100, | |
| color: Colors.red, | |
| ), | |
| ), | |
| ), | |
| ), | |
| ), | |
| ); | |
| } | |
| } |