Discover how a simple custom validator can save you hours of debugging and improve your app's trustworthiness!
Why Custom validators in Flutter? - Purpose & Use Cases
Imagine you are building a mobile app form where users enter their email and password. You want to check if the email looks right and the password is strong enough. Without custom validators, you have to write many repeated checks everywhere in your code.
Manually checking each input every time is slow and easy to forget. You might miss some rules or write inconsistent checks. This leads to bugs and frustrated users who get unclear error messages.
Custom validators let you write your own rules once and reuse them everywhere. They keep your code clean and make sure all inputs follow the same checks. This helps catch errors early and show clear messages to users.
if (email.contains('@') && email.endsWith('.com')) { /* valid */ } else { /* error */ }
String? validateEmail(String? value) { if (value == null || !value.contains('@')) return 'Invalid email'; return null; }Custom validators enable consistent, reusable, and clear input checks that improve user experience and app reliability.
In a signup form, a custom validator can check if a password has at least 8 characters, a number, and a special symbol, ensuring users create strong passwords every time.
Manual input checks are repetitive and error-prone.
Custom validators let you write rules once and reuse them.
This leads to cleaner code and better user feedback.
Practice
Solution
Step 1: Understand validator return type
A custom validator returns a String error message if input is invalid, otherwise null.Step 2: Identify valid input return
When input is valid, the validator returns null to indicate no error.Final Answer:
null -> Option BQuick Check:
Valid input returns null [OK]
- Returning empty string instead of null
- Returning boolean true/false
- Returning error message on valid input
Solution
Step 1: Check correct Dart syntax for validator
The validator must return a String or null. validator: (value) => value!.isEmpty ? 'Enter text' : null uses a concise lambda with a ternary operator correctly.Step 2: Identify null safety and return values
validator: (value) => value!.isEmpty ? 'Enter text' : null uses value! to assert non-null and returns error string if empty, else null.Final Answer:
validator: (value) => value!.isEmpty ? 'Enter text' : null -> Option DQuick Check:
Correct syntax uses ternary and returns null on valid input [OK]
- Missing return statement in block syntax
- Using if without else in lambda
- Returning null on empty input instead of error
validator: (value) {
if (value == null || value.length < 5) {
return 'Too short';
}
return null;
}
What happens if the user enters "abc"?Solution
Step 1: Analyze input length check
The validator checks if value is null or length less than 5, then returns 'Too short'.Step 2: Apply input "abc" to condition
"abc" length is 3, which is less than 5, so validator returns 'Too short'.Final Answer:
The form shows error message 'Too short' -> Option CQuick Check:
Input length < 5 triggers error message [OK]
- Ignoring null check and assuming no error
- Confusing return null with error message
- Assuming validator crashes on short input
validator: (value) {
if (value.isEmpty) {
return 'Cannot be empty';
}
}Solution
Step 1: Check null safety on value
value is nullable String?, so calling value.isEmpty without null check causes error.Step 2: Identify missing null check
Must check if value is null before calling isEmpty to avoid runtime error.Final Answer:
Using isEmpty on nullable value without null check -> Option AQuick Check:
Always check for null before isEmpty on nullable String [OK]
- Assuming value is non-null without checking
- Not returning null for valid input (though important)
- Confusing return types of validator
Solution
Step 1: Check null and '@' presence
validator: (value) { if (value == null || !value.contains('@')) return 'Invalid email'; if (!value.endsWith('.com')) return 'Must end with .com'; return null; } first checks if value is null or missing '@', returning 'Invalid email'.Step 2: Check if ends with '.com'
Then it checks if value ends with '.com', returning specific error if not.Step 3: Return null if all checks pass
If both checks pass, it returns null indicating valid input.Final Answer:
validator: (value) { if (value == null || !value.contains('@')) return 'Invalid email'; if (!value.endsWith('.com')) return 'Must end with .com'; return null; } -> Option AQuick Check:
Separate checks with clear error messages [OK]
- Combining conditions incorrectly with && or ||
- Returning null on null input without error
- Not checking null before calling methods
Ready to prove it?
Pass the test and this pattern moves unknown
