Complete Code For Crazy Switch In Flutter
main.dart
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: "Crazy Switch",
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
backgroundColor: Colors.orange,
title: Text("Crazy Switch"),
),
body: Container(
child: Center(
child: CrazySwitch(),
),
),
);
}
}
class CrazySwitch extends StatefulWidget {
@override
_CrazySwitchState createState() => _CrazySwitchState();
}
class _CrazySwitchState extends
State<CrazySwitch> with
SingleTickerProviderStateMixin{
bool isChecked = false;
Duration _duration = Duration(milliseconds: 370);
Animation<Alignment> _animation;
AnimationController _animationController;
@override
void initState() {
super.initState();
_animationController = AnimationController(
vsync: this,
duration: _duration
);
_animation = AlignmentTween(
begin: Alignment.centerLeft,
end: Alignment.centerRight
).animate(
CurvedAnimation(
parent: _animationController,
curve: Curves.bounceOut,
reverseCurve: Curves.bounceIn
),
);
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _animationController,
builder: (context, child){
return Container(
width: 110,
height: 50,
padding: EdgeInsets.fromLTRB(0, 6, 0, 6),
decoration: BoxDecoration(
color: isChecked ? Colors.deepPurple[400] : Colors.orange,
borderRadius: BorderRadius.all(
Radius.circular(40),
),
boxShadow: [
BoxShadow(
color: isChecked ? Colors.deepPurple[400] : Colors.orange,
blurRadius: 12,
offset: Offset(0, 8)
)
]
),
child: Stack(
children: <Widget>[
Align(
alignment: _animation.value,
child: GestureDetector(
onTap: (){
setState(() {
if(_animationController.isCompleted){
_animationController.reverse();
}else{
_animationController.forward();
}
isChecked = !isChecked;
});
},
child: Container(
width: 50,
height: 50,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.white,
),
),
),
)
],
),
);
},
);
}
}