Last active
April 7, 2023 07:28
-
-
Save sdkdeepa/280f1f275ee33e8e1df905a90a8aa310 to your computer and use it in GitHub Desktop.
SignUp Flutter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
void main() => runApp(const SignUpApp()); | |
class SignUpApp extends StatelessWidget { | |
const SignUpApp({super.key}); | |
@override | |
Widget build(BuildContext context) { | |
return MaterialApp( | |
routes: { | |
'/': (context) => const SignUpScreen(), | |
'/welcome': (context) => const WelcomeScreen(), | |
}, | |
); | |
} | |
} | |
class SignUpScreen extends StatelessWidget { | |
const SignUpScreen({super.key}); | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
backgroundColor: Colors.blue[200], | |
body: const Center( | |
child: SizedBox( | |
width: 500, | |
height: 400, | |
child: Card( | |
child: SignUpForm(), | |
), | |
), | |
), | |
); | |
} | |
} | |
class WelcomeScreen extends StatelessWidget { | |
const WelcomeScreen({super.key}); | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
backgroundColor: Colors.greenAccent, | |
body: Center( | |
child: | |
Text('Welcome!', style: Theme.of(context).textTheme.displayMedium), | |
), | |
); | |
} | |
} | |
class SignUpForm extends StatefulWidget { | |
const SignUpForm({super.key}); | |
@override | |
State<SignUpForm> createState() => _SignUpFormState(); | |
} | |
class _SignUpFormState extends State<SignUpForm> { | |
final _firstNameTextController = TextEditingController(); | |
final _lastNameTextController = TextEditingController(); | |
final _usernameTextController = TextEditingController(); | |
double _formProgress = 0; | |
void _updateFormProgress() { | |
var progress = 0.0; | |
final controllers = [ | |
_firstNameTextController, | |
_lastNameTextController, | |
_usernameTextController | |
]; | |
for (final controller in controllers) { | |
if (controller.value.text.isNotEmpty) { | |
progress += 1 / controllers.length; | |
} | |
} | |
setState(() { | |
_formProgress = progress; | |
}); | |
} | |
void _showWelcomeScreen() { | |
Navigator.of(context).pushNamed('/welcome'); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return Form( | |
onChanged: _updateFormProgress, | |
child: Column( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
AnimatedProgressIndicator(value: _formProgress), | |
Text('Create an Account', | |
style: Theme.of(context).textTheme.headlineMedium), | |
Padding( | |
padding: const EdgeInsets.all(8.0), | |
child: TextFormField( | |
controller: _firstNameTextController, | |
decoration: const InputDecoration(hintText: 'First name'), | |
), | |
), | |
Padding( | |
padding: const EdgeInsets.all(8.0), | |
child: TextFormField( | |
controller: _lastNameTextController, | |
decoration: const InputDecoration(hintText: 'Last name'), | |
), | |
), | |
Padding( | |
padding: const EdgeInsets.all(8.0), | |
child: TextFormField( | |
controller: _usernameTextController, | |
decoration: const InputDecoration(hintText: 'Username'), | |
), | |
), | |
TextButton( | |
style: ButtonStyle( | |
foregroundColor: MaterialStateProperty.resolveWith( | |
(Set<MaterialState> states) { | |
return states.contains(MaterialState.disabled) | |
? null | |
: Colors.white; | |
}), | |
backgroundColor: MaterialStateProperty.resolveWith( | |
(Set<MaterialState> states) { | |
return states.contains(MaterialState.disabled) | |
? null | |
: Colors.green; | |
}), | |
), | |
onPressed: _formProgress == 1 ? _showWelcomeScreen : null, | |
child: const Text('SIGN UP', | |
style: TextStyle( | |
fontWeight: FontWeight.w800, | |
fontFamily: 'Avenir', | |
letterSpacing: 0.5, | |
fontSize: 25, | |
)), | |
), | |
], | |
), | |
); | |
} | |
} | |
class AnimatedProgressIndicator extends StatefulWidget { | |
final double value; | |
const AnimatedProgressIndicator({ | |
super.key, | |
required this.value, | |
}); | |
@override | |
State<AnimatedProgressIndicator> createState() { | |
return _AnimatedProgressIndicatorState(); | |
} | |
} | |
class _AnimatedProgressIndicatorState extends State<AnimatedProgressIndicator> | |
with SingleTickerProviderStateMixin { | |
late AnimationController _controller; | |
late Animation<Color?> _colorAnimation; | |
late Animation<double> _curveAnimation; | |
@override | |
void initState() { | |
super.initState(); | |
_controller = AnimationController( | |
duration: const Duration(milliseconds: 1200), | |
vsync: this, | |
); | |
final colorTween = TweenSequence([ | |
TweenSequenceItem( | |
tween: ColorTween(begin: Colors.red, end: Colors.orange), | |
weight: 1, | |
), | |
TweenSequenceItem( | |
tween: ColorTween(begin: Colors.orange, end: Colors.yellow), | |
weight: 1, | |
), | |
TweenSequenceItem( | |
tween: ColorTween(begin: Colors.yellow, end: Colors.green), | |
weight: 1, | |
), | |
]); | |
_colorAnimation = _controller.drive(colorTween); | |
_curveAnimation = _controller.drive(CurveTween(curve: Curves.easeIn)); | |
} | |
@override | |
void didUpdateWidget(oldWidget) { | |
super.didUpdateWidget(oldWidget); | |
_controller.animateTo(widget.value); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return AnimatedBuilder( | |
animation: _controller, | |
builder: (context, child) => LinearProgressIndicator( | |
value: _curveAnimation.value, | |
valueColor: _colorAnimation, | |
backgroundColor: _colorAnimation.value?.withOpacity(0.4), | |
), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment