| // 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'; |
| |
| // Various tests to verify that Aniamted opacity layers (i.e. FadeTransition) do not |
| // dirty children even without explicit repaint boundaries. These intentionally use |
| // text to ensure we don't measure the opacity peephole case. |
| class AnimatedComplexOpacity extends StatefulWidget { |
| const AnimatedComplexOpacity({ super.key }); |
| |
| @override |
| State<AnimatedComplexOpacity> createState() => _AnimatedComplexOpacityState(); |
| } |
| |
| class _AnimatedComplexOpacityState extends State<AnimatedComplexOpacity> with SingleTickerProviderStateMixin { |
| late final AnimationController controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 5000)); |
| late final Animation<double> animation = controller.drive(Tween<double>(begin: 0.0, end: 1.0)); |
| |
| @override |
| void initState() { |
| super.initState(); |
| controller.forward(from: 0.0); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return MaterialApp( |
| home: Scaffold( |
| body: ListView( |
| children: <Widget>[ |
| for (int i = 0; i < 20; i++) |
| FadeTransition(opacity: animation, child: Center( |
| child: Transform.scale(scale: 1.01, child: const ModeratelyComplexWidget()), |
| )), |
| ], |
| ), |
| ), |
| ); |
| } |
| } |
| |
| class ModeratelyComplexWidget extends StatelessWidget { |
| const ModeratelyComplexWidget({ super.key }); |
| |
| @override |
| Widget build(BuildContext context) { |
| return const Material( |
| elevation: 10, |
| clipBehavior: Clip.hardEdge, |
| child: ListTile( |
| leading: Icon(Icons.abc, size: 24), |
| title: DecoratedBox(decoration: BoxDecoration(color: Colors.red), child: Text('Hello World')), |
| trailing: FlutterLogo(), |
| ), |
| ); |
| } |
| } |