Bird
Raised Fist0
Fluttermobile~20 mins

Form widget and GlobalKey in Flutter - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Form Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ ui_behavior
intermediate
2:00remaining
What happens when you call validate() on a Form with a GlobalKey?
Consider a Flutter app with a Form widget linked to a GlobalKey. What is the result of calling _formKey.currentState!.validate()?
Flutter
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

Form(
  key: _formKey,
  child: TextFormField(
    validator: (value) => value!.isEmpty ? 'Empty!' : null,
  ),
);

// Later in code
bool isValid = _formKey.currentState!.validate();
AIt submits the form data to the server automatically.
BIt resets all form fields to empty values.
CIt throws an error because validate() is not a method of FormState.
DIt runs all validators in the form fields and returns true if all are valid.
Attempts:
2 left
💡 Hint
Think about what validate() does in a form context.
❓ lifecycle
intermediate
1:30remaining
What is the role of GlobalKey in managing Form state?
Why do we use a GlobalKey with a Form widget in Flutter?
ATo uniquely identify the Form widget and access its state from anywhere in the widget tree.
BTo style the Form widget with global colors.
CTo automatically save form data to local storage.
DTo prevent the Form widget from rebuilding.
Attempts:
2 left
💡 Hint
Think about how you access form methods like validate() or save().
📝 Syntax
advanced
2:30remaining
Which code snippet correctly uses GlobalKey to validate a Form?
Select the code snippet that correctly creates a GlobalKey, assigns it to a Form, and validates the form on button press.
A
final _formKey = GlobalKey();

Form(
  key: _formKey,
  child: TextFormField(validator: (v) =&gt; v!.isEmpty ? 'Empty' : null),
);

ElevatedButton(onPressed: () {
  if (_formKey.currentState.validate()) {
    print('Valid');
  }
}, child: Text('Check'))
B
final _formKey = GlobalKey&lt;FormState&gt;();

Form(
  key: _formKey,
  child: TextFormField(validator: (v) =&gt; v!.isEmpty ? 'Empty' : null),
);

ElevatedButton(onPressed: () {
  if (_formKey.currentState!.save()) {
    print('Valid');
  }
}, child: Text('Check'))
C
final _formKey = GlobalKey&lt;FormState&gt;();

Form(
  key: _formKey,
  child: TextFormField(validator: (v) =&gt; v!.isEmpty ? 'Empty' : null),
);

ElevatedButton(onPressed: () {
  if (_formKey.currentState!.validate()) {
    print('Valid');
  }
}, child: Text('Check'))
D
final _formKey = GlobalKey&lt;FormState&gt;();

Form(
  key: _formKey,
  child: TextFormField(validator: (v) =&gt; v!.isEmpty ? 'Empty' : null),
);

ElevatedButton(onPressed: () {
  if (_formKey.validate()) {
    print('Valid');
  }
}, child: Text('Check'))
Attempts:
2 left
💡 Hint
Remember how to access FormState and call validate().
🔧 Debug
advanced
2:00remaining
Why does _formKey.currentState return null sometimes?
In a Flutter app, you get a null error when calling _formKey.currentState!.validate(). What is the most likely cause?
AThe GlobalKey was declared as final instead of var.
BThe Form widget is not mounted in the widget tree when validate() is called.
CThe validator function returns null instead of a string.
DThe TextFormField is missing a controller.
Attempts:
2 left
💡 Hint
Think about widget lifecycle and when currentState is available.
🧠 Conceptual
expert
3:00remaining
How does GlobalKey help preserve Form state during widget rebuilds?
In Flutter, why does using a GlobalKey help keep the form field values and validation state intact when the widget tree rebuilds?
AGlobalKey uniquely identifies the Form widget, so Flutter reuses the existing state instead of creating a new one.
BGlobalKey automatically saves form data to disk and restores it after rebuilds.
CGlobalKey disables widget rebuilds for the Form and its children.
DGlobalKey forces the Form to rebuild from scratch every time.
Attempts:
2 left
💡 Hint
Think about how Flutter matches widgets and their states.

Practice

(1/5)
1. What is the main purpose of using a Form widget in Flutter?
easy
A. To group multiple input fields for validation and saving
B. To create a button that submits data
C. To display images in a grid layout
D. To manage app navigation between screens

Solution

  1. Step 1: Understand the role of Form widget

    The Form widget groups input fields so you can validate and save them together.
  2. Step 2: Compare options with Form's purpose

    Only To group multiple input fields for validation and saving describes grouping input fields for validation and saving, which is the Form's main use.
  3. Final Answer:

    To group multiple input fields for validation and saving -> Option A
  4. Quick Check:

    Form groups inputs = D [OK]
Hint: Form groups inputs for validation and saving [OK]
Common Mistakes:
  • Thinking Form is for navigation or layout
  • Confusing Form with buttons or images
  • Assuming Form manages app state globally
2. Which of the following is the correct way to declare a GlobalKey for a Form in Flutter?
easy
A. final _formKey = GlobalKey();
B. final _formKey = GlobalKey<FormState>();
C. final _formKey = GlobalKey<Form>();
D. final _formKey = GlobalKey<State>();

Solution

  1. Step 1: Identify correct GlobalKey type for Form

    The GlobalKey must be typed as GlobalKey<FormState> to access the Form's state.
  2. Step 2: Check each option's type

    final _formKey = GlobalKey<FormState>(); uses GlobalKey<FormState>(), which is correct. Others use wrong or incomplete types.
  3. Final Answer:

    final _formKey = GlobalKey<FormState>(); -> Option B
  4. Quick Check:

    GlobalKey typed as FormState = A [OK]
Hint: GlobalKey must be typed as GlobalKey<FormState>() [OK]
Common Mistakes:
  • Using GlobalKey without type parameter
  • Using GlobalKey<Form> instead of FormState
  • Using GlobalKey<State> which is too generic
3. Given this Flutter code snippet:
final _formKey = GlobalKey<FormState>();

Form(
  key: _formKey,
  child: TextFormField(
    validator: (value) => value!.isEmpty ? 'Enter text' : null,
  ),
);

// Later in code
if (_formKey.currentState!.validate()) {
  print('Valid input');
} else {
  print('Invalid input');
}
What will be printed if the TextFormField is empty when validate() is called?
medium
A. Valid input
B. No output, code throws error
C. Invalid input
D. Nothing happens, validate() returns null

Solution

  1. Step 1: Understand validator behavior

    The validator returns 'Enter text' if the field is empty, which means validation fails.
  2. Step 2: Check validate() result

    validate() returns false if any validator returns a non-null string, so the else branch runs.
  3. Final Answer:

    Invalid input -> Option C
  4. Quick Check:

    Empty input triggers validator error = B [OK]
Hint: Validator returns error string means validate() is false [OK]
Common Mistakes:
  • Assuming validate() returns true on empty input
  • Confusing validator return null with error
  • Thinking validate() throws error on empty input
4. Identify the error in this Flutter code snippet:
final _formKey = GlobalKey<FormState>();

Form(
  key: _formKey,
  child: TextFormField(
    validator: (value) {
      if (value!.length < 3) return 'Too short';
      return null;
    },
  ),
);

// Later
if (_formKey.currentState.validate()) {
  print('Valid');
}
medium
A. GlobalKey should be GlobalKey<Form>
B. Validator should return a boolean, not a string
C. Missing exclamation mark after currentState
D. Calling validate() without null check on currentState

Solution

  1. Step 1: Check usage of currentState

    currentState can be null if Form is not mounted, so calling validate() without null check risks error.
  2. Step 2: Review code for null safety

    The code calls _formKey.currentState.validate() without ! or ?. which causes a compile error in null-safe Dart.
  3. Final Answer:

    Calling validate() without null check on currentState -> Option D
  4. Quick Check:

    currentState may be null, needs ! or ? = A [OK]
Hint: Always null-check currentState before validate() [OK]
Common Mistakes:
  • Forgetting to add ! after currentState
  • Returning boolean from validator instead of string/null
  • Using wrong GlobalKey type
5. You want to create a form with two TextFormFields and a submit button. You want to validate both fields and show errors if empty. Which approach correctly uses GlobalKey and Form to achieve this?
hard
A. Declare a GlobalKey<FormState>, assign it to Form's key, use validators on fields, call _formKey.currentState!.validate() on submit
B. Use separate GlobalKeys for each TextFormField and call validate() on each key
C. Use a GlobalKey without type parameter and call validate() on it
D. Wrap each TextFormField in its own Form widget with separate GlobalKeys

Solution

  1. Step 1: Understand Form and GlobalKey usage

    One GlobalKey<FormState> is used to manage the whole Form and validate all fields together.
  2. Step 2: Evaluate options for best practice

    Declare a GlobalKey<FormState>, assign it to Form's key, use validators on fields, call _formKey.currentState!.validate() on submit correctly uses one GlobalKey<FormState>, assigns it to Form, uses validators, and calls validate() once.
  3. Final Answer:

    Declare a GlobalKey<FormState>, assign it to Form's key, use validators on fields, call _formKey.currentState!.validate() on submit -> Option A
  4. Quick Check:

    Single GlobalKey<FormState> for whole Form = C [OK]
Hint: Use one GlobalKey<FormState> for entire Form [OK]
Common Mistakes:
  • Using multiple GlobalKeys for each field
  • Not typing GlobalKey as FormState
  • Wrapping each field in separate Form widgets
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard