Question #169EasyGeneral

What is the use of FocusManager ?

Answer

Overview

text
FocusManager
in Flutter is the system-level manager that tracks which widget currently has keyboard focus and provides methods to programmatically control focus behavior — especially for dismissing the keyboard.


Most Common Use — Dismiss Keyboard

dart
// Dismiss keyboard when tapping outside a text field
GestureDetector(
  onTap: () {
    FocusManager.instance.primaryFocus?.unfocus();
    // or:
    FocusScope.of(context).unfocus();
  },
  child: Scaffold(
    body: TextField(),
  ),
)

FocusManager Methods

dart
// Get the currently focused node
final current = FocusManager.instance.primaryFocus;
print(current); // FocusNode or null

// Unfocus the current focus (hides keyboard)
FocusManager.instance.primaryFocus?.unfocus();

// Check if any node is focused
bool hasFocus = FocusManager.instance.primaryFocus != null;

FocusNode — Control Individual Field Focus

dart
class LoginScreen extends StatefulWidget {
  
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final _emailFocus = FocusNode();
  final _passwordFocus = FocusNode();

  
  void dispose() {
    _emailFocus.dispose();
    _passwordFocus.dispose();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(
          focusNode: _emailFocus,
          textInputAction: TextInputAction.next,
          onSubmitted: (_) {
            // Move focus to password field on "Next"
            FocusScope.of(context).requestFocus(_passwordFocus);
          },
        ),
        TextField(
          focusNode: _passwordFocus,
          textInputAction: TextInputAction.done,
          onSubmitted: (_) {
            FocusManager.instance.primaryFocus?.unfocus(); // Hide keyboard
            _login();
          },
        ),
      ],
    );
  }
}

Auto-dismiss Keyboard on Scroll

dart
NotificationListener<ScrollNotification>(
  onNotification: (_) {
    FocusManager.instance.primaryFocus?.unfocus();
    return false;
  },
  child: ListView(...),
)

FocusManager vs FocusScope vs FocusNode

ClassPurpose
text
FocusManager
Global singleton — current focus state
text
FocusScope
Group of focusable nodes (per subtree)
text
FocusNode
Individual focusable item
text
FocusTraversalPolicy
Controls Tab order

Practical Use Cases

Use CaseCode
Dismiss keyboard on tap outside
text
FocusManager.instance.primaryFocus?.unfocus()
Move to next field
text
FocusScope.of(context).requestFocus(nextNode)
Request focus programmatically
text
focusNode.requestFocus()
Listen to focus changes
text
focusNode.addListener(() { ... })

Tip: Always

text
dispose()
your
text
FocusNode
instances to prevent memory leaks. Pair
text
FocusManager
with
text
GestureDetector
wrapping your Scaffold to dismiss the keyboard when tapping empty areas.