import 'package:flutter/material.dart'; class MakePaymentScreen extends StatefulWidget { const MakePaymentScreen({super.key}); @override State createState() => _MakePaymentScreenState(); } class _MakePaymentScreenState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _fadeAnimation; late Animation _slideAnimation; final _formKey = GlobalKey(); final _amountController = TextEditingController(); final _descriptionController = TextEditingController(); String _selectedBillType = 'Electricity'; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 800), ); _fadeAnimation = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation( parent: _controller, curve: const Interval(0.0, 0.5, curve: Curves.easeOut), ), ); _slideAnimation = Tween( begin: const Offset(0, 0.1), end: Offset.zero, ).animate( CurvedAnimation( parent: _controller, curve: const Interval(0.0, 0.5, curve: Curves.easeOut), ), ); _controller.forward(); } @override void dispose() { _controller.dispose(); _amountController.dispose(); _descriptionController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Make Payment'), ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16.0), child: FadeTransition( opacity: _fadeAnimation, child: SlideTransition( position: _slideAnimation, child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildBillTypeSelector(), const SizedBox(height: 24), _buildAmountField(), const SizedBox(height: 24), _buildDescriptionField(), const SizedBox(height: 32), _buildPayButton(), ], ), ), ), ), ), ), ); } Widget _buildBillTypeSelector() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Select Bill Type', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 12), Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), decoration: BoxDecoration( color: Theme.of(context).colorScheme.surface, borderRadius: BorderRadius.circular(12), border: Border.all( color: Theme.of(context).colorScheme.primary.withOpacity(0.2), ), ), child: DropdownButtonHideUnderline( child: DropdownButton( value: _selectedBillType, isExpanded: true, icon: const Icon(Icons.arrow_drop_down), items: [ 'Electricity', 'Water', 'Internet', 'Mobile', 'Gas', ].map((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), onChanged: (String? newValue) { if (newValue != null) { setState(() { _selectedBillType = newValue; }); } }, ), ), ), ], ); } Widget _buildAmountField() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Amount', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 12), TextFormField( controller: _amountController, keyboardType: TextInputType.number, decoration: const InputDecoration( prefixIcon: Icon(Icons.attach_money), hintText: 'Enter amount', ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter an amount'; } if (double.tryParse(value) == null) { return 'Please enter a valid amount'; } return null; }, ), ], ); } Widget _buildDescriptionField() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Description', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 12), TextFormField( controller: _descriptionController, maxLines: 3, decoration: const InputDecoration( hintText: 'Enter description (optional)', alignLabelWithHint: true, ), ), ], ); } Widget _buildPayButton() { return SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { if (_formKey.currentState!.validate()) { // TODO: Implement payment logic ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Payment processed successfully!'), backgroundColor: Colors.green, ), ); } }, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), ), child: const Text( 'Pay Now', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ); } }