// 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 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'picture_cache.dart';

class ClipperCachePage extends StatefulWidget {
  const ClipperCachePage({super.key});
  @override
  State<ClipperCachePage> createState() => _ClipperCachePageState();
}

class _ClipperCachePageState extends State<ClipperCachePage>
    with TickerProviderStateMixin {
  final double _animateOffset = 100;
  final ScrollController _controller = ScrollController();
  final bool _isComplex = true;
  late double _topMargin;

  @override
  void initState() {
    super.initState();
    const double itemHeight = 140;
    _topMargin = (window.physicalSize.height / window.devicePixelRatio - itemHeight * 3) / 2;
    if (_topMargin < 0) {
      _topMargin = 0;
    }
    _controller.addListener(() {
      if (_controller.offset < 10) {
        _controller.animateTo(_animateOffset, duration: const Duration(milliseconds: 1000), curve: Curves.ease);
      } else if (_controller.offset > _animateOffset - 10) {
        _controller.animateTo(0, duration: const Duration(milliseconds: 1000), curve: Curves.ease);
      }
    });
    Timer(const Duration(milliseconds: 500), () {
      _controller.animateTo(_animateOffset, duration: const Duration(milliseconds: 1000), curve: Curves.ease);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blue,
      body: ListView(
        controller: _controller,
        children: <Widget>[
          SizedBox(height: _topMargin),
          ClipPath(
            clipBehavior: Clip.antiAliasWithSaveLayer,
            child: _makeChild(0, _isComplex)
          ),
          ClipRect(
            clipBehavior: Clip.antiAliasWithSaveLayer,
            child: _makeChild(1, _isComplex)
          ),
          ClipRRect(
            clipBehavior: Clip.antiAliasWithSaveLayer,
            child: _makeChild(2, _isComplex)
          ),
          const SizedBox(height: 1000),
        ],
      ),
    );
  }

  Widget _makeChild(int itemIndex, bool complex) {
    final BoxDecoration decoration = BoxDecoration(
      color: Colors.white70,
      boxShadow: const <BoxShadow>[
        BoxShadow(
          blurRadius: 5.0,
        ),
      ],
      borderRadius: BorderRadius.circular(5.0),
    );
    return RepaintBoundary(
      child: Container(
        margin: const EdgeInsets.fromLTRB(10, 5, 10, 5),
        decoration: complex ? decoration : null,
        child: ListItem(index: itemIndex),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}
