import 'package:flutter/material.dart'; import '../fitness_app_theme.dart'; class AreaListView extends StatefulWidget { const AreaListView({super.key, this.mainScreenAnimationController, this.mainScreenAnimation}); final AnimationController? mainScreenAnimationController; final Animation? mainScreenAnimation; @override _AreaListViewState createState() => _AreaListViewState(); } class _AreaListViewState extends State with TickerProviderStateMixin { AnimationController? animationController; List areaListData = [ 'packages/fikoyt_ui/assets/fitness_app/area1.png', 'packages/fikoyt_ui/assets/fitness_app/area2.png', 'packages/fikoyt_ui/assets/fitness_app/area3.png', 'packages/fikoyt_ui/assets/fitness_app/area1.png', ]; @override void initState() { animationController = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this); super.initState(); } @override void dispose() { animationController?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: widget.mainScreenAnimationController!, builder: (BuildContext context, Widget? child) { return FadeTransition( opacity: widget.mainScreenAnimation!, child: Transform( transform: Matrix4.translationValues(0.0, 30 * (1.0 - widget.mainScreenAnimation!.value), 0.0), child: AspectRatio( aspectRatio: 1.0, child: Padding( padding: const EdgeInsets.only(left: 8.0, right: 8), child: GridView( padding: const EdgeInsets.only(left: 16, right: 16, top: 16, bottom: 16), physics: const BouncingScrollPhysics(), scrollDirection: Axis.vertical, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, mainAxisSpacing: 24.0, crossAxisSpacing: 24.0, childAspectRatio: 1.0, ), children: List.generate( areaListData.length, (int index) { final int count = areaListData.length; final Animation animation = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation( parent: animationController!, curve: Interval((1 / count) * index, 1.0, curve: Curves.fastOutSlowIn), ), ); animationController?.forward(); return AreaView( imagepath: areaListData[index], animation: animation, animationController: animationController!, ); }, ), ), ), ), ), ); }, ); } } class AreaView extends StatelessWidget { const AreaView({ super.key, this.imagepath, this.animationController, this.animation, }); final String? imagepath; final AnimationController? animationController; final Animation? animation; @override Widget build(BuildContext context) { return AnimatedBuilder( animation: animationController!, builder: (BuildContext context, Widget? child) { return FadeTransition( opacity: animation!, child: Transform( transform: Matrix4.translationValues(0.0, 50 * (1.0 - animation!.value), 0.0), child: Container( decoration: BoxDecoration( color: FitnessAppTheme.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(8.0), bottomLeft: Radius.circular(8.0), bottomRight: Radius.circular(8.0), topRight: Radius.circular(8.0)), boxShadow: [ BoxShadow(color: FitnessAppTheme.grey.withOpacity(0.4), offset: const Offset(1.1, 1.1), blurRadius: 10.0), ], ), child: Material( color: Colors.transparent, child: InkWell( focusColor: Colors.transparent, highlightColor: Colors.transparent, hoverColor: Colors.transparent, borderRadius: const BorderRadius.all(Radius.circular(8.0)), splashColor: FitnessAppTheme.nearlyDarkBlue.withOpacity(0.2), onTap: () {}, child: Column( children: [ Padding( padding: const EdgeInsets.only(top: 16, left: 16, right: 16), child: Image.asset(imagepath!), ), ], ), ), ), ), ), ); }, ); } }