import 'package:fikoyt_merkez/apps/fitness_app/fitness_app_theme.dart'; import 'package:fikoyt_merkez/apps/fitness_app/my_diary/meals_list_view.dart'; import 'package:fikoyt_merkez/apps/fitness_app/my_diary/water_view.dart'; import 'package:fikoyt_merkez/apps/fitness_app/ui_view/body_measurement.dart'; import 'package:fikoyt_merkez/apps/fitness_app/ui_view/glass_view.dart'; import 'package:fikoyt_merkez/apps/fitness_app/ui_view/mediterranean_diet_view.dart'; import 'package:fikoyt_merkez/apps/fitness_app/ui_view/title_view.dart'; import 'package:flutter/material.dart'; class MyDiaryScreen extends StatefulWidget { const MyDiaryScreen({super.key, this.animationController}); final AnimationController? animationController; @override _MyDiaryScreenState createState() => _MyDiaryScreenState(); } class _MyDiaryScreenState extends State with TickerProviderStateMixin { Animation? topBarAnimation; List listViews = []; final ScrollController scrollController = ScrollController(); double topBarOpacity = 0.0; @override void initState() { topBarAnimation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval(0, 0.5, curve: Curves.fastOutSlowIn))); addAllListData(); scrollController.addListener(() { if (scrollController.offset >= 24) { if (topBarOpacity != 1.0) { setState(() { topBarOpacity = 1.0; }); } } else if (scrollController.offset <= 24 && scrollController.offset >= 0) { if (topBarOpacity != scrollController.offset / 24) { setState(() { topBarOpacity = scrollController.offset / 24; }); } } else if (scrollController.offset <= 0) { if (topBarOpacity != 0.0) { setState(() { topBarOpacity = 0.0; }); } } }); super.initState(); } void addAllListData() { const int count = 9; listViews.add( TitleView( titleTxt: 'Mediterranean diet', subTxt: 'Details', animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 0, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!, ), ); listViews.add( MediterranesnDietView( animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 1, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!, ), ); listViews.add( TitleView( titleTxt: 'Meals today', subTxt: 'Customize', animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 2, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!, ), ); listViews.add( MealsListView( mainScreenAnimation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 3, 1.0, curve: Curves.fastOutSlowIn))), mainScreenAnimationController: widget.animationController, ), ); listViews.add( TitleView( titleTxt: 'Body measurement', subTxt: 'Today', animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 4, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!, ), ); listViews.add( BodyMeasurementView( animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 5, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!, ), ); listViews.add( TitleView( titleTxt: 'Water', subTxt: 'Aqua SmartBottle', animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 6, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!, ), ); listViews.add( WaterView( mainScreenAnimation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 7, 1.0, curve: Curves.fastOutSlowIn))), mainScreenAnimationController: widget.animationController!, ), ); listViews.add( GlassView(animation: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: widget.animationController!, curve: Interval((1 / count) * 8, 1.0, curve: Curves.fastOutSlowIn))), animationController: widget.animationController!), ); } Future getData() async { await Future.delayed(const Duration(milliseconds: 50)); return true; } @override Widget build(BuildContext context) { return Container( color: FitnessAppTheme.background, child: Scaffold( backgroundColor: Colors.transparent, body: Stack( children: [ getMainListViewUI(), getAppBarUI(), SizedBox( height: MediaQuery.of(context).padding.bottom, ) ], ), ), ); } Widget getMainListViewUI() { return FutureBuilder( future: getData(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (!snapshot.hasData) { return const SizedBox(); } else { return ListView.builder( controller: scrollController, padding: EdgeInsets.only( top: AppBar().preferredSize.height + MediaQuery.of(context).padding.top + 24, bottom: 62 + MediaQuery.of(context).padding.bottom, ), itemCount: listViews.length, scrollDirection: Axis.vertical, itemBuilder: (BuildContext context, int index) { widget.animationController?.forward(); return listViews[index]; }, ); } }, ); } Widget getAppBarUI() { return Column( children: [ AnimatedBuilder( animation: widget.animationController!, builder: (BuildContext context, Widget? child) { return FadeTransition( opacity: topBarAnimation!, child: Transform( transform: Matrix4.translationValues(0.0, 30 * (1.0 - topBarAnimation!.value), 0.0), child: Container( decoration: BoxDecoration( color: FitnessAppTheme.white.withOpacity(topBarOpacity), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(32.0), ), backgroundBlendMode: BlendMode.plus, boxShadow: [ BoxShadow(color: FitnessAppTheme.grey.withOpacity(0.7 * topBarOpacity), offset: const Offset(1.1, 1.1), blurRadius: 10.0), ], ), child: Column( children: [ SizedBox( height: MediaQuery.of(context).padding.top, ), Padding( padding: EdgeInsets.only(left: 16, right: 16, top: 16 - 8.0 * topBarOpacity, bottom: 12 - 8.0 * topBarOpacity), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( 'My Diary', textAlign: TextAlign.left, style: TextStyle( fontFamily: FitnessAppTheme.fontName, fontWeight: FontWeight.w700, fontSize: 22 + 6 - 6 * topBarOpacity, letterSpacing: 1.2, color: FitnessAppTheme.darkerText, ), ), ), ), SizedBox( height: 38, width: 38, child: InkWell( highlightColor: Colors.transparent, borderRadius: const BorderRadius.all(Radius.circular(32.0)), onTap: () {}, child: Center( child: Icon( Icons.keyboard_arrow_left, color: FitnessAppTheme.grey, ), ), ), ), Padding( padding: const EdgeInsets.only( left: 8, right: 8, ), child: Row( children: [ Padding( padding: const EdgeInsets.only(right: 8), child: Icon( Icons.calendar_today, color: FitnessAppTheme.grey, size: 18, ), ), Text( '15 May', textAlign: TextAlign.left, style: TextStyle( fontFamily: FitnessAppTheme.fontName, fontWeight: FontWeight.normal, fontSize: 18, letterSpacing: -0.2, color: FitnessAppTheme.darkerText, ), ), ], ), ), SizedBox( height: 38, width: 38, child: InkWell( highlightColor: Colors.transparent, borderRadius: const BorderRadius.all(Radius.circular(32.0)), onTap: () {}, child: Center( child: Icon( Icons.keyboard_arrow_right, color: FitnessAppTheme.grey, ), ), ), ), ], ), ) ], ), ), ), ); }, ) ], ); } }