parent
ee3b8e9501
commit
74edf69533
@ -0,0 +1,158 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:daflmusic/main.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
class User{
|
||||
final String chanteur;
|
||||
final String titre;
|
||||
final String urlImage;
|
||||
|
||||
const User({
|
||||
required this.chanteur,
|
||||
required this.titre,
|
||||
required this.urlImage,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
class DaflCard extends StatefulWidget {
|
||||
final String urlImage;
|
||||
final bool isFront;
|
||||
|
||||
const DaflCard({
|
||||
Key? key,
|
||||
required this.urlImage,
|
||||
required this.isFront,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<DaflCard> createState() => _DaflCardState();
|
||||
}
|
||||
class _DaflCardState extends State<DaflCard>{
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
WidgetsBinding.instance!.addPostFrameCallback((_) {
|
||||
final size = MediaQuery.of(context).size;
|
||||
|
||||
final provider = Provider.of<CardProvider>(context, listen: false);
|
||||
provider.setScreenSize(size);
|
||||
});
|
||||
}
|
||||
@override
|
||||
Widget build(BuildContext context) => SizedBox.expand(
|
||||
child: widget.isFront ? buildFrontCard() : buildCard(),
|
||||
);
|
||||
|
||||
Widget buildCard() => ClipRRect(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: NetworkImage(widget.urlImage),
|
||||
fit: BoxFit.cover,
|
||||
alignment: Alignment(0,0),
|
||||
),
|
||||
|
||||
borderRadius: BorderRadius.all(Radius.circular(20))
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
Widget buildStamps() {
|
||||
final provider = Provider.of<CardProvider>(context);
|
||||
final status = provider.getStatus();
|
||||
final opacity = provider.getStatusOpacity();
|
||||
|
||||
switch (status) {
|
||||
case CardStatus.like:
|
||||
final child = buildStamp(image: 'assets/images/icon_like.png', opacity: opacity);
|
||||
return child;
|
||||
case CardStatus.disLike:
|
||||
final child = buildStamp(image: 'assets/images/icon_dislike.png', opacity: opacity);
|
||||
return child;
|
||||
case CardStatus.discovery:
|
||||
final child = buildStamp(image: 'assets/images/icon_discovery.png', opacity: opacity);
|
||||
return child;
|
||||
default:
|
||||
return Container();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildStamp({
|
||||
double angle = 0,
|
||||
required String image,
|
||||
required double opacity,
|
||||
}) {
|
||||
return Opacity(opacity: opacity,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.black.withOpacity(0.75),
|
||||
border: Border.all(color: Color(0xFF3F1DC3), width: 6),
|
||||
|
||||
borderRadius: BorderRadius.all(Radius.circular(20))
|
||||
),
|
||||
child: Center(
|
||||
child: Image.asset(
|
||||
image,
|
||||
width: 100,
|
||||
),
|
||||
|
||||
),
|
||||
),
|
||||
),);
|
||||
}
|
||||
|
||||
Widget buildFrontCard() => GestureDetector(
|
||||
child: LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
final provider = Provider.of<CardProvider>(context);
|
||||
final position = provider.position;
|
||||
final milliseconds = provider.isDragging ? 0 : 400;
|
||||
|
||||
final center = constraints.smallest.center(Offset.zero);
|
||||
final angle = provider.angle * pi / 180;
|
||||
final rotatedMatrix = Matrix4.identity()
|
||||
..translate(center.dx, center.dy)
|
||||
..rotateZ(angle)
|
||||
..translate(-center.dx, -center.dy);
|
||||
|
||||
return AnimatedContainer(
|
||||
curve: Curves.easeInOut,
|
||||
duration: Duration(milliseconds: milliseconds),
|
||||
transform: rotatedMatrix..translate(position.dx, position.dy),
|
||||
child: Stack(
|
||||
children: [
|
||||
buildCard(),
|
||||
buildStamps(),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
onPanStart: (details) {
|
||||
final provider = Provider.of<CardProvider>(context, listen: false);
|
||||
|
||||
provider.startPosition(details);
|
||||
},
|
||||
onPanUpdate: (details) {
|
||||
final provider = Provider.of<CardProvider>(context, listen: false);
|
||||
|
||||
provider.updatePosition(details);
|
||||
},
|
||||
onPanEnd: (details) {
|
||||
final provider = Provider.of<CardProvider>(context, listen: false);
|
||||
|
||||
provider.endPosition();
|
||||
},
|
||||
|
||||
|
||||
|
||||
);
|
||||
}
|
Loading…
Reference in new issue