From a00f9370f6657155db9c6d5cab03b957c406ab89 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Mon, 31 Jul 2023 21:21:03 +0200 Subject: [PATCH] get post --- .../lib/components/post_component.dart | 817 ++++++++---------- .../justMUSIC/lib/screens/feed_screen.dart | 81 +- 2 files changed, 388 insertions(+), 510 deletions(-) diff --git a/Sources/justMUSIC/lib/components/post_component.dart b/Sources/justMUSIC/lib/components/post_component.dart index 3d63947..8473bdb 100644 --- a/Sources/justMUSIC/lib/components/post_component.dart +++ b/Sources/justMUSIC/lib/components/post_component.dart @@ -4,9 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:gradient_borders/box_borders/gradient_box_border.dart'; -import 'package:justmusic/main.dart'; -import 'package:justmusic/model/Music.dart'; -import 'package:justmusic/model/User.dart'; import 'package:text_scroll/text_scroll.dart'; import 'package:zoom_tap_animation/zoom_tap_animation.dart'; @@ -17,12 +14,7 @@ class PostComponent extends StatefulWidget { final Post post; final int index; - PostComponent( - {Key? key, - required this.callback, - required this.post, - required this.index}) - : super(key: key); + PostComponent({Key? key, required this.callback, required this.post, required this.index}) : super(key: key); @override State createState() => _PostComponentState(); @@ -32,14 +24,6 @@ class _PostComponentState extends State { bool choice = false; DateTime today = DateTime.now(); - Future fetchUserData() async { - //return await MyApp.userViewModel.getUser(widget.post.idUser); - } - - Future fetchMusicData() async { - //return await MyApp.musicViewModel.getMusic(widget.post.idMusic); - } - void switchChoice() { setState(() { choice = !choice; @@ -62,501 +46,388 @@ class _PostComponentState extends State { if (widget.callback == null) { return SizedBox( width: double.infinity, - child: FutureBuilder( - future: Future.wait([fetchMusicData(), fetchUserData()]), - builder: (context, AsyncSnapshot> snapshot) { - if (snapshot.hasData) { - final music = snapshot.data![0] as Music; - final user = snapshot.data![1] as User; - return Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.end, + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + ClipOval( + child: SizedBox.fromSize( + // Image radius + child: Image( + image: NetworkImage(widget.post.user.pp), + width: 40, + ), + ), + ), + Expanded( + flex: 8, + child: Padding( + padding: const EdgeInsets.only(left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipOval( - child: SizedBox.fromSize( - // Image radius - child: Image( - image: NetworkImage(user.pp), - width: 40, - ), - ), - ), - Expanded( - flex: 8, - child: Padding( - padding: const EdgeInsets.only(left: 10), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - user.pseudo, - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w600), - ), - widget.post.location.item2 != null - ? Text( - "${widget.post.location?.item1}, ${widget.post.location?.item2}", - style: - GoogleFonts.plusJakartaSans( - color: Colors.white - .withOpacity(0.4), - fontWeight: - FontWeight.w300, - fontSize: 13), - ) - : Text( - "", - style: - GoogleFonts.plusJakartaSans( - color: Colors.white - .withOpacity(0.4), - fontWeight: - FontWeight.w300, - fontSize: 13), - ) - ], - ), - ), + Text( + widget.post.user.pseudo, + style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600), ), - DateTime(today.year, today.month, today.day) - .isAtSameMomentAs(DateTime( - widget.post.date.year, - widget.post.date.month, - widget.post.date.day)) + widget.post.location.item2 != null ? Text( - "Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}", + "${widget.post.location.item1}, ${widget.post.location.item2}", style: GoogleFonts.plusJakartaSans( - color: - Colors.white.withOpacity(0.4), + color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), ) : Text( - "${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${widget.post.date.hour}:${widget.post.date.minute}", + "", style: GoogleFonts.plusJakartaSans( - color: - Colors.white.withOpacity(0.4), + color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), - ), + ) ], ), - SizedBox(height: 10), - ZoomTapAnimation( - onTap: () { - if (widget.post.selfie != null) { - switchChoice(); - } - }, - enableLongTapRepeatEvent: false, - longTapRepeatDuration: - const Duration(milliseconds: 100), - begin: 1.0, - end: 0.99, - beginDuration: const Duration(milliseconds: 70), - endDuration: const Duration(milliseconds: 100), - beginCurve: Curves.decelerate, - endCurve: Curves.easeInOutSine, - child: AspectRatio( - aspectRatio: 1 / 1, - child: Container( - decoration: BoxDecoration( - // add border - border: const GradientBoxBorder( - gradient: LinearGradient( - colors: [ - Colors.transparent, - Color(0xFF323232), - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter), - width: 2.5, - ), - // set border radius - borderRadius: BorderRadius.circular(20), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(18), - // implement image - child: Stack( - alignment: Alignment.bottomCenter, - children: [ - Image( - image: NetworkImage(choice - ? widget.post.selfie! - : music.cover!), - fit: BoxFit.cover, - width: double.infinity, - ), - widget.post.selfie != null - ? Positioned( - top: 0, - right: 0, - child: Padding( - padding: EdgeInsets.all(12), - child: Container( - constraints: - BoxConstraints( - maxWidth: 140, - maxHeight: 140), - width: 90.sp, - height: 90.sp, - decoration: BoxDecoration( - color: Colors.white, - // add border - border: Border.all( - width: 3, - color: - Colors.white), - // set border radius - borderRadius: - BorderRadius - .circular(15), - ), - child: ClipRRect( - borderRadius: - BorderRadius - .circular(13), - // implement image - child: Image( - image: NetworkImage( - choice - ? music.cover! - : widget.post - .selfie!), - fit: BoxFit.cover, - ), - ), - ), - )) - : Container(), - ], - ), - ), - ), - )), - SizedBox(height: 15), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 8, - child: TextScroll( - music.artists.first.name!, - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w600, - fontSize: 26.h), - mode: TextScrollMode.endless, - pauseBetween: Duration(milliseconds: 500), - velocity: Velocity( - pixelsPerSecond: Offset(20, 0)), - )), - Padding( - padding: EdgeInsets.only( - bottom: 10.h, right: 5.w, left: 5.w), - child: ClipOval( - child: Container( - width: 5.h, - height: 5.h, - color: Colors.white, - ), + ), + ), + DateTime(today.year, today.month, today.day).isAtSameMomentAs( + DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day)) + ? Text( + "Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), + ) + : Text( + "${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), + ), + ], + ), + SizedBox(height: 10), + ZoomTapAnimation( + onTap: () { + if (widget.post.selfie != null) { + switchChoice(); + } + }, + enableLongTapRepeatEvent: false, + longTapRepeatDuration: const Duration(milliseconds: 100), + begin: 1.0, + end: 0.99, + beginDuration: const Duration(milliseconds: 70), + endDuration: const Duration(milliseconds: 100), + beginCurve: Curves.decelerate, + endCurve: Curves.easeInOutSine, + child: AspectRatio( + aspectRatio: 1 / 1, + child: Container( + decoration: BoxDecoration( + // add border + border: const GradientBoxBorder( + gradient: LinearGradient(colors: [ + Colors.transparent, + Color(0xFF323232), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + width: 2.5, + ), + // set border radius + borderRadius: BorderRadius.circular(20), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + // implement image + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + Image( + image: NetworkImage(choice ? widget.post.selfie! : widget.post.music.cover!), + fit: BoxFit.cover, + width: double.infinity, ), - ), - Expanded( - flex: 8, - child: Padding( - padding: EdgeInsets.only(bottom: 2), - child: TextScroll( - music.title!, - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w300, - fontSize: 16.h), - mode: TextScrollMode.endless, - velocity: Velocity( - pixelsPerSecond: Offset(50, 20)), - pauseBetween: - Duration(milliseconds: 500), - ), - )), - Container(width: 10), - AutoSizeText( - music.date.toString(), - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.5), - fontWeight: FontWeight.w300, - fontSize: 16.h), - textAlign: TextAlign.end, - maxFontSize: 20, - ), - ], + widget.post.selfie != null + ? Positioned( + top: 0, + right: 0, + child: Padding( + padding: EdgeInsets.all(12), + child: Container( + constraints: BoxConstraints(maxWidth: 140, maxHeight: 140), + width: 90.sp, + height: 90.sp, + decoration: BoxDecoration( + color: Colors.white, + // add border + border: Border.all(width: 3, color: Colors.white), + // set border radius + borderRadius: BorderRadius.circular(15), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(13), + // implement image + child: Image( + image: NetworkImage( + choice ? widget.post.music.cover! : widget.post.selfie!), + fit: BoxFit.cover, + ), + ), + ), + )) + : Container(), + ], + ), + ), + ), + )), + SizedBox(height: 15), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 8, + child: TextScroll( + widget.post.music.artists.first.name!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h), + mode: TextScrollMode.endless, + pauseBetween: Duration(milliseconds: 500), + velocity: Velocity(pixelsPerSecond: Offset(20, 0)), + )), + Padding( + padding: EdgeInsets.only(bottom: 10.h, right: 5.w, left: 5.w), + child: ClipOval( + child: Container( + width: 5.h, + height: 5.h, + color: Colors.white, ), - ], - ); - } else { - return CupertinoActivityIndicator(); - } - })); + ), + ), + Expanded( + flex: 8, + child: Padding( + padding: EdgeInsets.only(bottom: 2), + child: TextScroll( + widget.post.music.title!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w300, fontSize: 16.h), + mode: TextScrollMode.endless, + velocity: Velocity(pixelsPerSecond: Offset(50, 20)), + pauseBetween: Duration(milliseconds: 500), + ), + )), + Container(width: 10), + AutoSizeText( + widget.post.music.date.toString(), + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h), + textAlign: TextAlign.end, + maxFontSize: 20, + ), + ], + ), + ], + )); } return SizedBox( width: double.infinity, - child: FutureBuilder( - future: Future.wait([fetchMusicData(), fetchUserData()]), - builder: (context, AsyncSnapshot> snapshot) { - if (snapshot.hasData) { - final music = snapshot.data![0] as Music; - final user = snapshot.data![1] as User; - return Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.end, + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + ClipOval( + child: SizedBox.fromSize( + // Image radius + child: Image( + image: NetworkImage(widget.post.user.pp), + width: 40, + ), + ), + ), + Expanded( + flex: 8, + child: Padding( + padding: const EdgeInsets.only(left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipOval( - child: SizedBox.fromSize( - // Image radius - child: Image( - image: NetworkImage(user.pp), - width: 40, - ), - ), - ), - Expanded( - flex: 8, - child: Padding( - padding: const EdgeInsets.only(left: 10), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - user.pseudo, - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w600), - ), - widget.post.location.item2 != null - ? Text( - "${widget.post.location?.item1}, ${widget.post.location?.item2}", - style: - GoogleFonts.plusJakartaSans( - color: Colors.white - .withOpacity(0.4), - fontWeight: - FontWeight.w300, - fontSize: 13), - ) - : Text( - "", - style: - GoogleFonts.plusJakartaSans( - color: Colors.white - .withOpacity(0.4), - fontWeight: - FontWeight.w300, - fontSize: 13), - ) - ], - ), - ), + Text( + widget.post.user.pseudo, + style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600), ), - DateTime(today.year, today.month, today.day) - .isAtSameMomentAs(DateTime( - widget.post.date.year, - widget.post.date.month, - widget.post.date.day)) + widget.post.location.item2 != null ? Text( - "Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}", + "${widget.post.location?.item1}, ${widget.post.location?.item2}", style: GoogleFonts.plusJakartaSans( color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), ) : Text( - "${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${widget.post.date.hour}:${widget.post.date.minute}", + "", style: GoogleFonts.plusJakartaSans( color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), - ), + ) ], ), - SizedBox(height: 10), - ZoomTapAnimation( - onTap: () { - widget.callback!(widget.index); - }, - enableLongTapRepeatEvent: false, - longTapRepeatDuration: - const Duration(milliseconds: 100), - begin: 1.0, - end: 0.99, - beginDuration: const Duration(milliseconds: 70), - endDuration: const Duration(milliseconds: 100), - beginCurve: Curves.decelerate, - endCurve: Curves.easeInOutSine, - child: AspectRatio( - aspectRatio: 1 / 1, - child: Container( - decoration: BoxDecoration( - // add border - border: const GradientBoxBorder( - gradient: LinearGradient( - colors: [ - Colors.transparent, - Color(0xFF323232), - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter), - width: 2.5, - ), - // set border radius - borderRadius: BorderRadius.circular(20), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(18), - // implement image - child: Stack( - alignment: Alignment.bottomCenter, - children: [ - Image( - image: NetworkImage(music.cover!), - fit: BoxFit.cover, - width: double.infinity, - ), - Image( - image: AssetImage( - "assets/images/shadow_post.png"), - fit: BoxFit.fitHeight, - width: double.infinity, - ), - Padding( - padding: EdgeInsets.all(15), - child: AutoSizeText( - '“${widget.post.description}”', - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 15.sp), - maxFontSize: 20, - maxLines: 1, - ), - ), - widget.post.selfie != null - ? Positioned( - top: 0, - right: 0, - child: Padding( - padding: EdgeInsets.all(12), - child: Container( - constraints: BoxConstraints( - maxWidth: 140, - maxHeight: 140), - width: 90.sp, - height: 90.sp, - decoration: BoxDecoration( - color: Colors.white, - // add border - border: Border.all( - width: 3, - color: Colors.white), - // set border radius - borderRadius: - BorderRadius.circular( - 15), - ), - child: ClipRRect( - borderRadius: - BorderRadius.circular( - 13), - // implement image - child: Image( - image: NetworkImage( - widget - .post.selfie!), - fit: BoxFit.cover, - ), - ), - ), - )) - : Container(), - ], - ), - ), + ), + ), + DateTime(today.year, today.month, today.day).isAtSameMomentAs( + DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day)) + ? Text( + "Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), + ) + : Text( + "${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), + ), + ], + ), + SizedBox(height: 10), + ZoomTapAnimation( + onTap: () { + widget.callback!(widget.index); + }, + enableLongTapRepeatEvent: false, + longTapRepeatDuration: const Duration(milliseconds: 100), + begin: 1.0, + end: 0.99, + beginDuration: const Duration(milliseconds: 70), + endDuration: const Duration(milliseconds: 100), + beginCurve: Curves.decelerate, + endCurve: Curves.easeInOutSine, + child: AspectRatio( + aspectRatio: 1 / 1, + child: Container( + decoration: BoxDecoration( + // add border + border: const GradientBoxBorder( + gradient: LinearGradient(colors: [ + Colors.transparent, + Color(0xFF323232), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + width: 2.5, + ), + // set border radius + borderRadius: BorderRadius.circular(20), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + // implement image + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + Image( + image: NetworkImage(widget.post.music.cover!), + fit: BoxFit.cover, + width: double.infinity, ), - )), - SizedBox(height: 15), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 8, - child: TextScroll( - music.artists.first.name!, + Image( + image: AssetImage("assets/images/shadow_post.png"), + fit: BoxFit.fitHeight, + width: double.infinity, + ), + Padding( + padding: EdgeInsets.all(15), + child: AutoSizeText( + '“${widget.post.description}”', style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w600, - fontSize: 26.h), - mode: TextScrollMode.endless, - pauseBetween: Duration(milliseconds: 500), - velocity: Velocity( - pixelsPerSecond: Offset(20, 0)), - )), - Padding( - padding: EdgeInsets.only( - bottom: 10.h, right: 5.w, left: 5.w), - child: ClipOval( - child: Container( - width: 5.h, - height: 5.h, - color: Colors.white, + color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.sp), + maxFontSize: 20, + maxLines: 1, ), ), - ), - Expanded( - flex: 8, - child: Padding( - padding: EdgeInsets.only(bottom: 2), - child: TextScroll( - music.title!, - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w300, - fontSize: 16.h), - mode: TextScrollMode.endless, - velocity: Velocity( - pixelsPerSecond: Offset(50, 20)), - pauseBetween: Duration(milliseconds: 500), - ), - )), - Container(width: 10), - AutoSizeText( - music.date.toString(), - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.5), - fontWeight: FontWeight.w300, - fontSize: 16.h), - textAlign: TextAlign.end, - maxFontSize: 20, - ), - ], + widget.post.selfie != null + ? Positioned( + top: 0, + right: 0, + child: Padding( + padding: EdgeInsets.all(12), + child: Container( + constraints: BoxConstraints(maxWidth: 140, maxHeight: 140), + width: 90.sp, + height: 90.sp, + decoration: BoxDecoration( + color: Colors.white, + // add border + border: Border.all(width: 3, color: Colors.white), + // set border radius + borderRadius: BorderRadius.circular(15), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(13), + // implement image + child: Image( + image: NetworkImage(widget.post.selfie!), + fit: BoxFit.cover, + ), + ), + ), + )) + : Container(), + ], + ), ), - ], - ); - } else { - return CupertinoActivityIndicator(); - } - })); + ), + )), + SizedBox(height: 15), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 8, + child: TextScroll( + widget.post.music.artists.first.name!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h), + mode: TextScrollMode.endless, + pauseBetween: Duration(milliseconds: 500), + velocity: Velocity(pixelsPerSecond: Offset(20, 0)), + )), + Padding( + padding: EdgeInsets.only(bottom: 10.h, right: 5.w, left: 5.w), + child: ClipOval( + child: Container( + width: 5.h, + height: 5.h, + color: Colors.white, + ), + ), + ), + Expanded( + flex: 8, + child: Padding( + padding: EdgeInsets.only(bottom: 2), + child: TextScroll( + widget.post.music.title!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w300, fontSize: 16.h), + mode: TextScrollMode.endless, + velocity: Velocity(pixelsPerSecond: Offset(50, 20)), + pauseBetween: Duration(milliseconds: 500), + ), + )), + Container(width: 10), + AutoSizeText( + widget.post.music.date.toString(), + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h), + textAlign: TextAlign.end, + maxFontSize: 20, + ), + ], + ), + ], + )); }, ), ); diff --git a/Sources/justMUSIC/lib/screens/feed_screen.dart b/Sources/justMUSIC/lib/screens/feed_screen.dart index d904874..04ad76a 100644 --- a/Sources/justMUSIC/lib/screens/feed_screen.dart +++ b/Sources/justMUSIC/lib/screens/feed_screen.dart @@ -216,45 +216,52 @@ class _FeedScreenState extends State with SingleTickerProviderStateM return Scaffold( resizeToAvoidBottomInset: true, backgroundColor: bgColor, - body: Stack( - children: [ - CircularRevealAnimation( - animation: animation, - centerOffset: Offset(30.w, -100), - child: Container( - constraints: BoxConstraints(maxWidth: 600), - padding: EdgeInsets.fromLTRB(defaultPadding, 100.h, defaultPadding, 0), - child: ListView.builder( - physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), - clipBehavior: Clip.none, - shrinkWrap: true, - itemCount: displayFeed.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.only(bottom: 40), - child: PostComponent(callback: openDetailPost, post: displayFeed[index], index: index), - ); - }, - )), - ), - IgnorePointer( - child: Container( - height: 240.h, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topRight, - stops: [0.3, 1], - colors: [bgColor.withOpacity(0.9), bgColor.withOpacity(0)])), + extendBodyBehindAppBar: true, + body: Container( + width: double.infinity, + child: Stack( + fit: StackFit.expand, + children: [ + Align( + child: CircularRevealAnimation( + animation: animation, + centerOffset: Offset(30.w, -100), + child: Container( + constraints: BoxConstraints(maxWidth: 600), + padding: EdgeInsets.fromLTRB(defaultPadding, 100.h, defaultPadding, 0), + child: ListView.builder( + physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), + clipBehavior: Clip.none, + shrinkWrap: true, + itemCount: displayFeed.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(bottom: 40), + child: PostComponent(callback: openDetailPost, post: displayFeed[index], index: index), + ); + }, + )), + ), ), - ), - Align( - alignment: Alignment.topCenter, - child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: 800), - child: TopNavBarComponent(callback: changeFeed), + IgnorePointer( + child: Container( + height: 100.h, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topRight, + stops: [0.3, 1], + colors: [bgColor.withOpacity(0.9), bgColor.withOpacity(0)])), + ), ), - ), - ], + Align( + alignment: Alignment.topCenter, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: 800), + child: TopNavBarComponent(callback: changeFeed), + ), + ), + ], + ), ), ); }