import 'package:flutter/material.dart'; import '../../../../../core/constants/colors.dart'; /// [ExpandableSectionCard] est une carte qui peut s'étendre pour révéler des éléments enfants. /// Ce composant inclut des animations d'extension, des logs pour chaque action et une expérience utilisateur optimisée. class ExpandableSectionCard extends StatefulWidget { final String title; final IconData icon; final List children; const ExpandableSectionCard({ Key? key, required this.title, required this.icon, required this.children, }) : super(key: key); @override _ExpandableSectionCardState createState() => _ExpandableSectionCardState(); } class _ExpandableSectionCardState extends State with SingleTickerProviderStateMixin { bool _isExpanded = false; late AnimationController _controller; late Animation _iconRotation; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 300), ); _iconRotation = Tween(begin: 0, end: 0.5).animate( CurvedAnimation(parent: _controller, curve: Curves.easeOut), ); } @override void dispose() { _controller.dispose(); super.dispose(); } void _toggleExpansion() { setState(() { _isExpanded = !_isExpanded; _isExpanded ? _controller.forward() : _controller.reverse(); debugPrint("[LOG] ${_isExpanded ? 'Ouverture' : 'Fermeture'} de l'ExpandableSectionCard : ${widget.title}"); }); } @override Widget build(BuildContext context) { return Card( color: AppColors.cardColor, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), elevation: 3, child: Column( children: [ ListTile( leading: Icon(widget.icon, color: AppColors.accentColor), title: Text( widget.title, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.white, ), ), trailing: RotationTransition( turns: _iconRotation, child: Icon(Icons.expand_more, color: AppColors.accentColor), ), onTap: _toggleExpansion, ), // Contenu de l'expansion AnimatedCrossFade( duration: const Duration(milliseconds: 300), firstChild: Container(), secondChild: Column(children: widget.children), crossFadeState: _isExpanded ? CrossFadeState.showSecond : CrossFadeState.showFirst, ), ], ), ); } }