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