recap component
continuous-integration/drone/push Build is passing Details

PROFIL_PAGE_LDE
Lucas Delanier 2 years ago
parent 43e0e279bd
commit 2e266b85c2

@ -296,6 +296,27 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="firebase_messaging">
<value>
<list>
<option value="$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_messaging-14.6.5/lib" />
</list>
</value>
</entry>
<entry key="firebase_messaging_platform_interface">
<value>
<list>
<option value="$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_messaging_platform_interface-4.5.4/lib" />
</list>
</value>
</entry>
<entry key="firebase_messaging_web">
<value>
<list>
<option value="$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_messaging_web-3.5.4/lib" />
</list>
</value>
</entry>
<entry key="firebase_storage"> <entry key="firebase_storage">
<value> <value>
<list> <list>
@ -950,6 +971,9 @@
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-2.15.0/lib" /> <root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-2.15.0/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_platform_interface-4.8.0/lib" /> <root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_platform_interface-4.8.0/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.6.0/lib" /> <root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.6.0/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_messaging-14.6.5/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_messaging_platform_interface-4.5.4/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_messaging_web-3.5.4/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-11.2.5/lib" /> <root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-11.2.5/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-4.4.4/lib" /> <root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-4.4.4/lib" />
<root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.6.5/lib" /> <root url="file://$USER_HOME$/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.6.5/lib" />

@ -0,0 +1,52 @@
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../values/constants.dart';
class LittleCapsule extends StatelessWidget {
final bool isEmpty;
final DateTime date;
const LittleCapsule({super.key, required this.isEmpty, required this.date});
@override
Widget build(BuildContext context) {
if (isEmpty) {
return Flexible(
child: Container(
constraints: BoxConstraints(maxWidth: 45, maxHeight: 45),
decoration: BoxDecoration(
color: searchBarColor,
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Color(0xFF282828), width: 1),
),
child: const Center(
child: Icon(
Icons.rocket_launch,
color: Color(0xFF464646),
size: 18,
),
),
),
);
}
return Flexible(
child: Container(
constraints: BoxConstraints(maxWidth: 45, maxHeight: 45),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [bgModal, bgModal.withOpacity(0)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
stops: [0, 1]),
borderRadius: BorderRadius.circular(5),
),
child: Center(
child: Text(
date.day.toString(),
style: GoogleFonts.plusJakartaSans(color: Color(0xFF464646), fontWeight: FontWeight.w800, fontSize: 17),
),
),
),
);
}
}

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:gradient_borders/box_borders/gradient_box_border.dart'; import 'package:gradient_borders/box_borders/gradient_box_border.dart';
import 'package:justmusic/components/profil_picture_component.dart';
import 'package:text_scroll/text_scroll.dart'; import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart'; import 'package:zoom_tap_animation/zoom_tap_animation.dart';
@ -50,15 +51,7 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
ClipOval( ProfilPictureComponent(user: widget.post.user),
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(widget.post.user.pp),
width: 40,
),
),
),
Expanded( Expanded(
flex: 8, flex: 8,
child: Padding( child: Padding(
@ -237,15 +230,7 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
ClipOval( ProfilPictureComponent(user: widget.post.user),
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(widget.post.user.pp),
width: 40,
),
),
),
Expanded( Expanded(
flex: 8, flex: 8,
child: Padding( child: Padding(

@ -0,0 +1,33 @@
import 'package:flutter/Material.dart';
import 'package:justmusic/screens/user_screen.dart';
import '../config/routes.dart';
import '../model/User.dart';
class ProfilPictureComponent extends StatelessWidget {
final User user;
const ProfilPictureComponent({super.key, required this.user});
void _openDetail(BuildContext context) {
print("cc");
Navigator.of(context).push(routeUser(user));
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
_openDetail(context);
},
child: ClipOval(
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(user.pp),
width: 40,
),
),
),
);
}
}

@ -0,0 +1,111 @@
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../values/constants.dart';
import 'little_post_recap_component.dart';
import 'package:intl/intl.dart';
class RecapComponent extends StatelessWidget {
const RecapComponent({super.key});
@override
Widget build(BuildContext context) {
List<String> weekDays = ['L', 'M', 'M', 'J', 'V', 'S', 'D'];
DateTime currentDate = DateTime.now();
return Container(
decoration: BoxDecoration(
color: profileBttnColor,
borderRadius: BorderRadius.circular(10),
border: Border.all(color: grayColor, width: 1)),
height: 120,
clipBehavior: Clip.hardEdge,
child: Column(
children: [
Expanded(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: postbutton,
borderRadius: BorderRadius.only(topRight: Radius.circular(10), topLeft: Radius.circular(10)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 6)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 5)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 4)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 3)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 2)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 1)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 0)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
],
),
)),
Padding(
padding: EdgeInsets.all(12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
LittleCapsule(
isEmpty: false,
date: DateTime.now(),
),
LittleCapsule(isEmpty: true, date: currentDate.subtract(const Duration(days: 5))),
LittleCapsule(isEmpty: false, date: currentDate.subtract(const Duration(days: 4))),
LittleCapsule(isEmpty: false, date: currentDate.subtract(const Duration(days: 3))),
LittleCapsule(isEmpty: false, date: currentDate.subtract(const Duration(days: 2))),
LittleCapsule(isEmpty: false, date: currentDate.subtract(const Duration(days: 1))),
LittleCapsule(isEmpty: false, date: currentDate.subtract(const Duration(days: 0))),
],
),
)
],
),
);
}
}

@ -27,8 +27,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
bool isDismissed = true; bool isDismissed = true;
final DateTime midnight = DateTime( final DateTime midnight = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1);
DateTime.now().year, DateTime.now().month, DateTime.now().day + 1);
void actionSurBouton(bool choice) async { void actionSurBouton(bool choice) async {
widget.callback(choice); widget.callback(choice);
@ -47,8 +46,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
var now = tz.TZDateTime.now(franceTimeZone); var now = tz.TZDateTime.now(franceTimeZone);
// Calculate the midnight time for the next day in France timezone // Calculate the midnight time for the next day in France timezone
var midnight = var midnight = tz.TZDateTime(franceTimeZone, now.year, now.month, now.day + 1);
tz.TZDateTime(franceTimeZone, now.year, now.month, now.day + 1);
bool res = await MyApp.postViewModel.getAvailable(); bool res = await MyApp.postViewModel.getAvailable();
if (res) { if (res) {
@ -67,8 +65,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Text( child: Text(
"Capsule disponible", "Capsule disponible",
style: style: GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
), ),
), ),
flushbarStyle: FlushbarStyle.FLOATING, flushbarStyle: FlushbarStyle.FLOATING,
@ -105,8 +102,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: CountdownTimer( child: CountdownTimer(
endTime: midnight.millisecondsSinceEpoch, endTime: midnight.millisecondsSinceEpoch,
textStyle: textStyle: GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
), ),
), ),
flushbarStyle: FlushbarStyle.FLOATING, flushbarStyle: FlushbarStyle.FLOATING,
@ -153,7 +149,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
flex: 1, flex: 1,
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
onTap: () async { onTap: () {
Navigator.of(context).push(routeAddFriend()); Navigator.of(context).push(routeAddFriend());
}, },
child: const Icon( child: const Icon(
@ -199,30 +195,23 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
} }
}, },
child: LayoutBuilder( child: LayoutBuilder(
builder: (BuildContext context, builder: (BuildContext context, BoxConstraints constraints) {
BoxConstraints constraints) {
if (choice) { if (choice) {
return Padding( return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText( child: AutoSizeText(
"Mes amis", "Mes amis",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500, fontSize: 16, color: Colors.white),
fontSize: 16,
color: Colors.white),
), ),
); );
} else { } else {
return Padding( return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText( child: AutoSizeText(
"Mes amis", "Mes amis",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300, fontSize: 16, color: unactiveFeed),
fontSize: 16,
color: unactiveFeed),
)); ));
} }
}, },
@ -239,29 +228,22 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
} }
}, },
child: LayoutBuilder( child: LayoutBuilder(
builder: (BuildContext context, builder: (BuildContext context, BoxConstraints constraints) {
BoxConstraints constraints) {
if (choice) { if (choice) {
return Padding( return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText( child: AutoSizeText(
"Discovery", "Discovery",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300, fontSize: 16, color: unactiveFeed),
fontSize: 16,
color: unactiveFeed),
)); ));
} else { } else {
return Padding( return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText( child: AutoSizeText(
"Discovery", "Discovery",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500, fontSize: 16, color: Colors.white),
fontSize: 16,
color: Colors.white),
)); ));
} }
}, },

@ -2,6 +2,9 @@ import 'package:flutter/Material.dart';
import 'package:justmusic/screens/add_friend_screen.dart'; import 'package:justmusic/screens/add_friend_screen.dart';
import 'package:justmusic/screens/feed_screen.dart'; import 'package:justmusic/screens/feed_screen.dart';
import 'package:justmusic/screens/profile_screen.dart'; import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/user_screen.dart';
import '../model/User.dart';
Route routeProfile() { Route routeProfile() {
return PageRouteBuilder( return PageRouteBuilder(
@ -50,3 +53,21 @@ Route routeRocket() {
}, },
); );
} }
Route routeUser(User user) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => UserScreen(user: user),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(1.0, 0.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}

@ -17,6 +17,7 @@ import 'package:justmusic/screens/launching_rocker_screen.dart';
import 'package:justmusic/screens/post_screen.dart'; import 'package:justmusic/screens/post_screen.dart';
import 'package:justmusic/screens/profile_screen.dart'; import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/registration_screen.dart'; import 'package:justmusic/screens/registration_screen.dart';
import 'package:justmusic/screens/user_screen.dart';
import 'package:justmusic/screens/welcome_screen.dart'; import 'package:justmusic/screens/welcome_screen.dart';
import 'package:justmusic/view_model/CommentViewModel.dart'; import 'package:justmusic/view_model/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart'; import 'package:justmusic/view_model/MusicViewModel.dart';
@ -67,8 +68,7 @@ class _MyAppState extends State<MyApp> {
print('User is currently signed out!'); print('User is currently signed out!');
return null; return null;
} else { } else {
MyApp.userViewModel.userCurrent = MyApp.userViewModel.userCurrent = (await (MyApp.userViewModel.getUser(user.uid)))!;
(await (MyApp.userViewModel.getUser(user.uid)))!;
userCurrent = Stream.value(MyApp.userViewModel.userCurrent); userCurrent = Stream.value(MyApp.userViewModel.userCurrent);
print('User is signed in!'); print('User is signed in!');
} }
@ -115,16 +115,14 @@ class _MyAppState extends State<MyApp> {
return FutureBuilder<userJustMusic.User?>( return FutureBuilder<userJustMusic.User?>(
future: MyApp.userViewModel.getUser(snapshot.data!.uid), future: MyApp.userViewModel.getUser(snapshot.data!.uid),
builder: (context, userSnapshot) { builder: (context, userSnapshot) {
if (userSnapshot.connectionState == if (userSnapshot.connectionState == ConnectionState.waiting) {
ConnectionState.waiting) {
return LoadingScreen(); return LoadingScreen();
} else if (userSnapshot.hasData) { } else if (userSnapshot.hasData) {
MyApp.userViewModel.userCurrent = userSnapshot.data!; MyApp.userViewModel.userCurrent = userSnapshot.data!;
return AnimatedSwitcher( return AnimatedSwitcher(
duration: Duration(milliseconds: 1000), duration: Duration(milliseconds: 1000),
transitionBuilder: (child, animation) { transitionBuilder: (child, animation) {
return FadeTransition( return FadeTransition(opacity: animation, child: child);
opacity: animation, child: child);
}, },
child: FeedScreen(), child: FeedScreen(),
); );

@ -0,0 +1,155 @@
import 'package:flutter/Material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import '../components/profile_component.dart';
import '../components/recap_component.dart';
import '../main.dart';
import '../model/User.dart';
import '../values/constants.dart';
class UserScreen extends StatefulWidget {
final User user;
const UserScreen({super.key, required this.user});
@override
State<UserScreen> createState() => _UserScreenState();
}
class _UserScreenState extends State<UserScreen> {
late bool isClicked;
@override
Widget build(BuildContext context) {
isClicked = MyApp.userViewModel.isFriend(widget.user.id);
return Scaffold(
appBar: PreferredSize(
preferredSize: Size(double.infinity, 58),
child: Container(
height: double.infinity,
color: bgAppBar,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
child: Stack(
alignment: Alignment.centerLeft,
children: [
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pop(context, true);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
)),
Align(
child: Text(
widget.user.pseudo,
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
),
)
],
),
),
),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: bgColor,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(top: 68.h, bottom: 40),
child: ProfileComponent(user: widget.user),
),
Align(
alignment: Alignment.topCenter,
child: isClicked
? SizedBox(
// Définir une largeur minimale pour le bouton "Ajouter"
width: 120, // Réglez cette valeur en fonction de vos besoins
child: Material(
borderRadius: BorderRadius.all(Radius.circular(5)),
color: selectedButton,
child: InkWell(
splashColor: Colors.white.withOpacity(0.3),
onTap: () async {
await MyApp.userViewModel.addOrDeleteFriend(widget.user.id);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Vous ne suivez plus ${widget.user.pseudo}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
),
backgroundColor: Colors.red,
closeIconColor: Colors.white,
),
);
setState(() {});
},
child: Container(
padding: EdgeInsets.fromLTRB(28, 7, 28, 7),
decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(7))),
child: Center(
child: Text("Ajouté",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 13)),
),
))),
)
: SizedBox(
// Définir une largeur minimale pour le bouton "Ajouter"
width: 120, // Réglez cette valeur en fonction de vos besoins
child: Material(
borderRadius: BorderRadius.all(Radius.circular(5)),
color: primaryColor,
child: InkWell(
splashColor: Colors.white.withOpacity(0.3),
onTap: () async {
await MyApp.userViewModel.addOrDeleteFriend(widget.user.id);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: primaryColor,
content: Text(
"Vous suivez à present ${widget.user.pseudo}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
),
),
);
setState(() {});
},
child: Container(
padding: EdgeInsets.fromLTRB(25, 7, 25, 7),
decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(7))),
child: Center(
child: Text("Ajouter",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 13)),
),
)))),
),
SizedBox(
height: 40,
),
RecapComponent()
],
),
),
),
),
);
}
}
Loading…
Cancel
Save