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