flutter - TextField with animated hint / label

Flutter - TextField with animated hint / label

To create a TextField with an animated hint or label in Flutter, you can use the AnimatedPlaceholder widget from the flutter_animated_text package or use a combination of TextField, FocusNode, and AnimatedCrossFade for custom animations.

Here's a step-by-step approach to achieve an animated label for a TextField:

Example: Animated Label for a TextField

  1. Add Dependencies

    Add flutter_animated_text to your pubspec.yaml file:

    dependencies: flutter: sdk: flutter flutter_animated_text: ^2.1.0 
  2. Create Animated TextField

    Here's a complete example using AnimatedCrossFade to animate the label of a TextField:

    import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Animated TextField')), body: Padding( padding: const EdgeInsets.all(16.0), child: AnimatedTextField(), ), ), ); } } class AnimatedTextField extends StatefulWidget { @override _AnimatedTextFieldState createState() => _AnimatedTextFieldState(); } class _AnimatedTextFieldState extends State<AnimatedTextField> { late FocusNode _focusNode; late TextEditingController _controller; bool _isFocused = false; @override void initState() { super.initState(); _focusNode = FocusNode() ..addListener(() { setState(() { _isFocused = _focusNode.hasFocus || _controller.text.isNotEmpty; }); }); _controller = TextEditingController(); } @override void dispose() { _focusNode.dispose(); _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ AnimatedCrossFade( duration: const Duration(milliseconds: 300), firstChild: Text( 'Label', style: TextStyle(color: Colors.blueGrey, fontSize: 16), ), secondChild: Text( 'Label', style: TextStyle(color: Colors.blue, fontSize: 12), ), crossFadeState: _isFocused ? CrossFadeState.showSecond : CrossFadeState.showFirst, ), TextField( controller: _controller, focusNode: _focusNode, decoration: InputDecoration( border: OutlineInputBorder(), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.blue), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.grey), ), ), ), ], ); } } 

Explanation

  1. Dependencies:

    • The flutter_animated_text package provides animations for text, but in this example, we use built-in Flutter widgets to achieve the effect.
  2. AnimatedTextField Widget:

    • FocusNode: Detects when the TextField gains or loses focus.
    • TextEditingController: Manages the text in the TextField.
    • AnimatedCrossFade: Animates between two different widgets (or states) based on a condition. Here, it animates between two states of the label.
  3. State Management:

    • _isFocused is a boolean that determines if the TextField is focused or not, and it drives the animation state.
    • AnimatedCrossFade transitions between the label styles based on the _isFocused state.
  4. TextField:

    • Uses a FocusNode to listen for focus changes and update the label animation accordingly.

Tips

  • Customization: You can adjust the animation duration, label styles, and colors as needed.
  • Alternative Animations: For more complex animations, consider using packages like flutter_animated_text or creating custom animations using AnimationController and Tween.

This approach provides a smooth transition for the label of a TextField as it animates between focused and unfocused states.

Examples

  1. How to create an animated hint in a TextField using AnimatedSwitcher in Flutter?

    • Description: Use AnimatedSwitcher to animate the hint text when the TextField is focused or unfocused.
    • Code:
      import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: AnimatedHintTextField(), ), ), ); } } class AnimatedHintTextField extends StatefulWidget { @override _AnimatedHintTextFieldState createState() => _AnimatedHintTextFieldState(); } class _AnimatedHintTextFieldState extends State<AnimatedHintTextField> { final TextEditingController _controller = TextEditingController(); bool _hasFocus = false; @override Widget build(BuildContext context) { return Focus( onFocusChange: (focus) { setState(() { _hasFocus = focus; }); }, child: TextField( controller: _controller, decoration: InputDecoration( hintText: _hasFocus ? 'Enter your text' : 'Hint', border: OutlineInputBorder(), ), ), ); } } 
  2. How to animate the label of a TextField using AnimatedContainer in Flutter?

    • Description: Use AnimatedContainer to animate the label of a TextField when the TextField is focused.
    • Code:
      import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: AnimatedLabelTextField(), ), ), ); } } class AnimatedLabelTextField extends StatefulWidget { @override _AnimatedLabelTextFieldState createState() => _AnimatedLabelTextFieldState(); } class _AnimatedLabelTextFieldState extends State<AnimatedLabelTextField> { final TextEditingController _controller = TextEditingController(); bool _hasFocus = false; @override Widget build(BuildContext context) { return Focus( onFocusChange: (focus) { setState(() { _hasFocus = focus; }); }, child: TextField( controller: _controller, decoration: InputDecoration( labelText: 'Label', floatingLabelBehavior: FloatingLabelBehavior.auto, border: OutlineInputBorder(), labelStyle: TextStyle( fontSize: _hasFocus ? 20 : 16, color: _hasFocus ? Colors.blue : Colors.grey, ), contentPadding: EdgeInsets.all(16), ), ), ); } } 
  3. How to create a TextField with an animated floating label in Flutter?

    • Description: Use AnimatedPadding and AnimatedOpacity to animate the floating label of a TextField.
    • Code:
      import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: AnimatedFloatingLabelTextField(), ), ), ); } } class AnimatedFloatingLabelTextField extends StatefulWidget { @override _AnimatedFloatingLabelTextFieldState createState() => _AnimatedFloatingLabelTextFieldState(); } class _AnimatedFloatingLabelTextFieldState extends State<AnimatedFloatingLabelTextField> { final TextEditingController _controller = TextEditingController(); bool _hasFocus = false; @override Widget build(BuildContext context) { return Focus( onFocusChange: (focus) { setState(() { _hasFocus = focus; }); }, child: TextField( controller: _controller, decoration: InputDecoration( labelText: 'Enter text', floatingLabelBehavior: FloatingLabelBehavior.auto, border: OutlineInputBorder(), labelStyle: TextStyle( fontSize: _hasFocus ? 20 : 16, color: _hasFocus ? Colors.blue : Colors.grey, ), contentPadding: EdgeInsets.all(16), ), ), ); } } 
  4. How to animate the hint text when TextField gains focus using AnimatedSwitcher?

    • Description: Animate the hint text using AnimatedSwitcher when the TextField is focused or unfocused.
    • Code:
      import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: AnimatedHintSwitcher(), ), ), ); } } class AnimatedHintSwitcher extends StatefulWidget { @override _AnimatedHintSwitcherState createState() => _AnimatedHintSwitcherState(); } class _AnimatedHintSwitcherState extends State<AnimatedHintSwitcher> { final TextEditingController _controller = TextEditingController(); bool _hasFocus = false; @override Widget build(BuildContext context) { return Focus( onFocusChange: (focus) { setState(() { _hasFocus = focus; }); }, child: TextField( controller: _controller, decoration: InputDecoration( hintText: AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: Text( _hasFocus ? 'Type here...' : 'Hint text', key: ValueKey<bool>(_hasFocus), ), ), border: OutlineInputBorder(), ), ), ); } } 
  5. How to implement a TextField with an animated placeholder in Flutter?

    • Description: Use AnimatedOpacity to animate the visibility of the placeholder text.
    • Code:
      import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: AnimatedPlaceholderTextField(), ), ), ); } } class AnimatedPlaceholderTextField extends StatefulWidget { @override _AnimatedPlaceholderTextFieldState createState() => _AnimatedPlaceholderTextFieldState(); } class _AnimatedPlaceholderTextFieldState extends State<AnimatedPlaceholderTextField> { final TextEditingController _controller = TextEditingController(); bool _hasText = false; @override Widget build(BuildContext context) { return TextField( controller: _controller, onChanged: (text) { setState(() { _hasText = text.isNotEmpty; }); }, decoration: InputDecoration( hintText: 'Enter your text', hintStyle: TextStyle( color: _hasText ? Colors.transparent : Colors.grey, ), border: OutlineInputBorder(), contentPadding: EdgeInsets.all(16), ), ); } } 
  6. How to create a TextField with animated label moving up when focused in Flutter?

    • Description: Use AnimatedPositioned to animate the label's movement when the TextField gains focus.
    • Code:
      import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: AnimatedLabelPositionTextField(), ), ), ); } } class AnimatedLabelPositionTextField extends StatefulWidget { @override _AnimatedLabelPositionTextFieldState createState() => _AnimatedLabelPositionTextFieldState(); } class _AnimatedLabelPositionTextFieldState extends State<AnimatedLabelPositionTextField> { final TextEditingController _controller = TextEditingController(); bool _hasFocus = false; @override Widget build(BuildContext context) { return Focus( onFocusChange: (focus) { setState(() { _hasFocus = focus; }); }, child: Stack( children: [ AnimatedPositioned( duration: Duration(milliseconds: 300), top: _hasFocus ? 0 : 20, child: Text( 'Label', style: TextStyle( fontSize: _hasFocus ? 14 : 20, color: _hasFocus ? Colors.blue : Colors.grey, ), ), ), TextField( controller: _controller, decoration: InputDecoration( border: OutlineInputBorder(), contentPadding: EdgeInsets.only(top: 24), ), ), ], ), ); } } 

More Tags

required octave windows-task-scheduler organization nscala-time tkinter-entry pow generalized-linear-model derby spy

More Programming Questions

More Weather Calculators

More Other animals Calculators

More Everyday Utility Calculators

More Pregnancy Calculators