proxybuy-flutter/lib/widgets/custom_switch_tile.dart

122 lines
3.4 KiB
Dart

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<bool> onChanged;
const CustomSwitchTile({
super.key,
required this.icon,
required this.title,
required this.value,
required this.onChanged,
});
@override
State<CustomSwitchTile> createState() => _CustomSwitchTileState();
}
class _CustomSwitchTileState extends State<CustomSwitchTile>
with TickerProviderStateMixin {
late AnimationController _scaleController;
late Animation<double> _scaleAnimation;
@override
void initState() {
super.initState();
_scaleController = AnimationController(
duration: const Duration(milliseconds: 200),
vsync: this,
);
_scaleAnimation = Tween<double>(
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,
),
),
);
},
),
],
),
);
}
}