import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:tm_app/core/utils/size_config.dart'; import '../../../core/theme/colors.dart'; class DetailDropDown extends StatefulWidget { final String title; final List items; const DetailDropDown({required this.title, required this.items, super.key}); @override State createState() => _DetailDropDownState(); } class _DetailDropDownState extends State with SingleTickerProviderStateMixin { bool isOpen = true; late AnimationController _animationController; late Animation _rotationAnimation; @override void initState() { super.initState(); _animationController = AnimationController( duration: const Duration(milliseconds: 300), vsync: this, ); _rotationAnimation = Tween(begin: 0.0, end: 0.5).animate( CurvedAnimation(parent: _animationController, curve: Curves.elasticIn), ); } @override void dispose() { _animationController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Column( children: [ Row( children: [ InkWell( onTap: () { setState(() { isOpen = !isOpen; }); if (isOpen) { _animationController.forward(); } else { _animationController.reverse(); } }, child: Container( width: 24.0.w(), height: 24.0.h(), decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: AppColors.grey60), ), alignment: Alignment.center, child: AnimatedBuilder( animation: _rotationAnimation, builder: (context, child) { return Icon( isOpen ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, color: AppColors.grey60, size: 12, ); }, ), ), ), SizedBox(width: 8.0.w()), Text( widget.title, style: TextStyle( color: AppColors.grey80, fontSize: 16.0.sp(), fontWeight: FontWeight.w600, ), ), ], ), SizedBox(height: 12.0.h()), AnimatedSize( duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, child: isOpen ? Column( children: widget.items .map( (e) => Padding( padding: EdgeInsets.only(left: 12.0.w()), child: Text(e), ), ) .toList(), ) : const SizedBox.shrink(), ), ], ); } }