import 'package:fikoyt_hmi_pano/apps/fitness_app/fitness_app_theme.dart'; import 'package:fikoyt_hmi_pano/apps/fitness_app/models/meals_list_data.dart'; import 'package:fikoyt_merkez/main.dart'; import 'package:flutter/material.dart'; class MealsListView extends StatefulWidget { const MealsListView({super.key, this.mainScreenAnimationController, this.mainScreenAnimation}); final AnimationController? mainScreenAnimationController; final Animation? mainScreenAnimation; @override _MealsListViewState createState() => _MealsListViewState(); } class _MealsListViewState extends State with TickerProviderStateMixin { AnimationController? animationController; List mealsListData = MealsListData.tabIconsList; @override void initState() { animationController = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this); super.initState(); } Future getData() async { await Future.delayed(const Duration(milliseconds: 50)); return true; } @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: SizedBox( height: 216, width: double.infinity, child: ListView.builder( physics: BouncingScrollPhysics(), padding: const EdgeInsets.only(top: 0, bottom: 0, right: 16, left: 16), itemCount: mealsListData.length, scrollDirection: Axis.horizontal, itemBuilder: (BuildContext context, int index) { final int count = mealsListData.length > 10 ? 10 : mealsListData.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 MealsView( mealsListData: mealsListData[index], animation: animation, animationController: animationController!, ); }, ), ), ), ); }, ); } } class MealsView extends StatelessWidget { const MealsView({super.key, this.mealsListData, this.animationController, this.animation}); final MealsListData? mealsListData; 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(100 * (1.0 - animation!.value), 0.0, 0.0), child: SizedBox( width: 130, child: Stack( children: [ Padding( padding: const EdgeInsets.only(top: 32, left: 8, right: 8, bottom: 16), child: Container( decoration: BoxDecoration( boxShadow: [ BoxShadow(color: HexColor(mealsListData!.endColor).withOpacity(0.6), offset: const Offset(1.1, 4.0), blurRadius: 8.0), ], gradient: LinearGradient( colors: [ HexColor(mealsListData!.startColor), HexColor(mealsListData!.endColor), ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: const BorderRadius.only( bottomRight: Radius.circular(8.0), bottomLeft: Radius.circular(8.0), topLeft: Radius.circular(8.0), topRight: Radius.circular(54.0), ), ), child: Padding( padding: const EdgeInsets.only(top: 54, left: 16, right: 16, bottom: 8), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( mealsListData!.titleTxt, textAlign: TextAlign.center, style: TextStyle( fontFamily: FitnessAppTheme.fontName, fontWeight: FontWeight.bold, fontSize: 16, letterSpacing: 0.2, color: FitnessAppTheme.white, ), ), Expanded( child: Padding( padding: const EdgeInsets.only(top: 8, bottom: 8), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( mealsListData!.meals!.join('\n'), style: TextStyle( fontFamily: FitnessAppTheme.fontName, fontWeight: FontWeight.w500, fontSize: 10, letterSpacing: 0.2, color: FitnessAppTheme.white, ), ), ], ), ), ), mealsListData?.kacl != 0 ? Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( '${(mealsListData!.kacl * animation!.value).toInt()}', textAlign: TextAlign.center, style: TextStyle( fontFamily: FitnessAppTheme.fontName, fontWeight: FontWeight.w500, fontSize: 24, letterSpacing: 0.2, color: FitnessAppTheme.white, ), ), Padding( padding: const EdgeInsets.only(left: 4, bottom: 3), child: Text( 'kcal', style: TextStyle( fontFamily: FitnessAppTheme.fontName, fontWeight: FontWeight.w500, fontSize: 10, letterSpacing: 0.2, color: FitnessAppTheme.white, ), ), ), ], ) : Container( decoration: BoxDecoration( color: FitnessAppTheme.nearlyWhite, shape: BoxShape.circle, boxShadow: [ BoxShadow(color: FitnessAppTheme.nearlyBlack.withOpacity(0.4), offset: Offset(8.0, 8.0), blurRadius: 8.0), ], ), child: Padding( padding: const EdgeInsets.all(6.0), child: Icon( Icons.add, color: HexColor(mealsListData!.endColor), size: 24, ), ), ), ], ), ), ), ), Positioned( top: 0, left: 0, child: Container( width: 84, height: 84, decoration: BoxDecoration( color: FitnessAppTheme.nearlyWhite.withOpacity(0.2), shape: BoxShape.circle, ), ), ), Positioned( top: 0, left: 8, child: SizedBox( width: 80, height: 80, child: Image.asset(mealsListData!.imagePath), ), ) ], ), ), ), ); }, ); } }