import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:lba/res/colors.dart'; class CustomSwitchTile extends StatefulWidget { final Widget icon; final String title; final bool value; final ValueChanged onChanged; const CustomSwitchTile({ super.key, required this.icon, required this.title, required this.value, required this.onChanged, }); @override State createState() => _CustomSwitchTileState(); } class _CustomSwitchTileState extends State with TickerProviderStateMixin { late AnimationController _scaleController; late Animation _scaleAnimation; @override void initState() { super.initState(); _scaleController = AnimationController( duration: const Duration(milliseconds: 200), vsync: this, ); _scaleAnimation = Tween( begin: 1.0, end: 1.05, ).animate(CurvedAnimation( parent: _scaleController, curve: Curves.elasticOut, )); } @override void dispose() { _scaleController.dispose(); super.dispose(); } void _handleChange(bool value) { _scaleController.forward().then((_) { _scaleController.reverse(); }); widget.onChanged(value); WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { final brightness = Theme.of(context).brightness; final isDark = brightness == Brightness.dark; SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: isDark ? Brightness.light : Brightness.dark, statusBarBrightness: isDark ? Brightness.dark : Brightness.light, systemNavigationBarColor: AppColors.scaffoldBackground, systemNavigationBarIconBrightness: isDark ? Brightness.light : Brightness.dark, systemNavigationBarDividerColor: AppColors.divider, ), ); } }); } @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(vertical: 2.0), child: Row( children: [ widget.icon, const SizedBox(width: 16), Expanded( child: Text( widget.title, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: AppColors.textPrimary, ), ), ), AnimatedBuilder( animation: _scaleController, builder: (context, child) { return Transform.scale( scale: 0.75 * _scaleAnimation.value, child: AnimatedContainer( duration: const Duration(milliseconds: 300), curve: Curves.easeInOutCubic, child: Switch( value: widget.value, onChanged: _handleChange, activeColor: AppColors.surface, activeTrackColor: AppColors.trunOff_On, inactiveThumbColor: AppColors.surface, inactiveTrackColor: AppColors.divider.withOpacity(0.4), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), ), ); }, ), ], ), ); } }