You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
337 lines
13 KiB
337 lines
13 KiB
import 'dart:async';
|
|
import 'dart:math';
|
|
|
|
import 'package:custom_clippers/custom_clippers.dart';
|
|
import 'package:flutter/material.dart';
|
|
//import 'package:flutter_custom_clippers/flutter_custom_clippers.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
//import '../models/articles.dart';
|
|
|
|
class OneArticle extends StatefulWidget {
|
|
const OneArticle(
|
|
{super.key,
|
|
required this.couleurCpay,
|
|
required this.id,
|
|
required this.id_categorie,
|
|
required this.categorie,
|
|
required this.photos,
|
|
required this.designation,
|
|
required this.prix_ticket,
|
|
required this.reference,
|
|
required this.pourcentage,
|
|
required this.date_tirage});
|
|
final String id;
|
|
final String id_categorie;
|
|
final String categorie;
|
|
final String photos;
|
|
final String designation;
|
|
final String prix_ticket;
|
|
final String reference;
|
|
final int pourcentage;
|
|
final String date_tirage;
|
|
//final Article article;
|
|
final Color couleurCpay;
|
|
|
|
@override
|
|
State<OneArticle> createState() => _OneArticleState();
|
|
}
|
|
|
|
class _OneArticleState extends State<OneArticle> {
|
|
double init = 0.0;
|
|
double percent = 0;
|
|
late Timer time;
|
|
progressAnimation(int nb) {
|
|
if (mounted) {
|
|
setState(() {
|
|
if (init < nb / 100) {
|
|
init = init + 0.01;
|
|
percent = init * 100;
|
|
} else {
|
|
time.cancel();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
animProgress() {
|
|
time = Timer.periodic(const Duration(milliseconds: 1), (timer) {
|
|
progressAnimation(widget.pourcentage);
|
|
});
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
animProgress();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
double screenwidth = MediaQuery.of(context).size.width;
|
|
|
|
return Scaffold(
|
|
body: Center(
|
|
child: SizedBox(
|
|
width: screenwidth * 0.8,
|
|
child: Card(
|
|
elevation: 2,
|
|
//color: widget.couleurCpay.withOpacity(0.6),
|
|
color: Colors.white,
|
|
child: Column(
|
|
children: [
|
|
Expanded(
|
|
flex: 3,
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
image: DecorationImage(
|
|
fit: BoxFit.cover,
|
|
image: NetworkImage(widget.photos)),
|
|
//color: Colors.amber,
|
|
borderRadius: const BorderRadius.only(
|
|
topLeft: Radius.circular(10),
|
|
topRight: Radius.circular(10))),
|
|
//height: 200.sp,
|
|
child: Stack(
|
|
children: [
|
|
Align(
|
|
alignment: const Alignment(1, -1),
|
|
child: ClipPath(
|
|
clipper: TrapeziumClipper(),
|
|
child: Container(
|
|
width: 100,
|
|
height: 100,
|
|
decoration: const BoxDecoration(
|
|
color: Colors.green,
|
|
),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Transform.rotate(
|
|
angle: pi / 4,
|
|
child: Align(
|
|
alignment: const Alignment(0.5, -0.7),
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
widget.reference,
|
|
style: TextStyle(
|
|
fontSize: 11.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Align(
|
|
alignment: Alignment.bottomCenter,
|
|
child: FractionallySizedBox(
|
|
widthFactor: 1,
|
|
child: Container(
|
|
decoration: const BoxDecoration(
|
|
color: Colors.red,
|
|
borderRadius:
|
|
BorderRadius.all(Radius.circular(10))),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
textAlign: TextAlign.left,
|
|
'Tirage dans:24:00:00',
|
|
style: TextStyle(
|
|
fontSize: 11.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Stack(children: [
|
|
Align(
|
|
alignment: const Alignment(0.9, -1),
|
|
child: Container(
|
|
height: 50,
|
|
width: 50,
|
|
decoration: BoxDecoration(
|
|
image: const DecorationImage(
|
|
fit: BoxFit.contain,
|
|
image: AssetImage('lib/photos/285-min.png'),
|
|
),
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(20)),
|
|
),
|
|
),
|
|
Align(
|
|
alignment: Alignment.bottomLeft,
|
|
child: FractionallySizedBox(
|
|
heightFactor: 1,
|
|
widthFactor: 0.8,
|
|
child: ClipPath(
|
|
clipper: UpperNipMessageClipper(MessageType.send,
|
|
bubbleRadius: 20, sizeOfNip: 20, sizeRatio: 2),
|
|
child: Container(
|
|
margin: const EdgeInsets.only(top: 25),
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFFd2d6de),
|
|
borderRadius: BorderRadius.circular(10)),
|
|
child: FittedBox(
|
|
fit: BoxFit.scaleDown,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
widget.designation,
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.black,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
]),
|
|
),
|
|
Expanded(
|
|
child: FractionallySizedBox(
|
|
widthFactor: 0.8,
|
|
heightFactor: 0.9,
|
|
child: Card(
|
|
elevation: 2,
|
|
color: Colors.amber,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
const FittedBox(
|
|
fit: BoxFit.scaleDown,
|
|
child: Icon(
|
|
size: 50,
|
|
Icons.calendar_month,
|
|
color: Colors.black,
|
|
),
|
|
),
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
FittedBox(
|
|
fit: BoxFit.scaleDown,
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
'Ticket 0 MGA',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.black,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
Container(
|
|
color: Colors.black,
|
|
width: 120,
|
|
height: 1,
|
|
),
|
|
FittedBox(
|
|
fit: BoxFit.scaleDown,
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
'0% Avant tirage',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.black,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
)),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: EdgeInsets.only(left: 40.sp, right: 40.sp),
|
|
child: ElevatedButton(
|
|
style: ElevatedButton.styleFrom(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10)),
|
|
backgroundColor: const Color(0xFF6334A9)),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Row(
|
|
//mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
FittedBox(
|
|
fit: BoxFit.scaleDown,
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
'Achat ticket',
|
|
style: TextStyle(
|
|
fontSize: 18.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
FittedBox(
|
|
fit: BoxFit.scaleDown,
|
|
child: Icon(
|
|
size: 23.sp,
|
|
Icons.shopping_cart_rounded,
|
|
color: Colors.white,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
],
|
|
),
|
|
onPressed: () => {}),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class TrapeziumClipper extends CustomClipper<Path> {
|
|
@override
|
|
Path getClip(Size size) {
|
|
Path path = Path();
|
|
path.lineTo(size.width / 2, 0);
|
|
path.lineTo(size.width, size.height / 2);
|
|
path.lineTo(size.width, size.height);
|
|
// path.lineTo(size.width, 0);
|
|
//path.close();
|
|
return path;
|
|
}
|
|
|
|
@override
|
|
bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
|
|
return true;
|
|
}
|
|
}
|
|
|