4.1 KiB
4.1 KiB
| name | description |
|---|---|
| widgets-input | Flutter input widgets - TextField, TextFormField, Form, FormField, and input validation |
Input Widgets
Flutter provides text input widgets with validation and form handling.
TextField
Single-line text input.
TextField(
decoration: const InputDecoration(
labelText: 'Label',
hintText: 'Hint text',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.person),
suffixIcon: Icon(Icons.clear),
),
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
onChanged: (value) {
// Handle text change
},
onSubmitted: (value) {
// Handle submit
},
)
TextFormField
Text input with validation.
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
Form(
key: _formKey,
child: TextFormField(
controller: _emailController,
decoration: const InputDecoration(
labelText: 'Email',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter email';
}
if (!value.contains('@')) {
return 'Please enter valid email';
}
return null;
},
onSaved: (value) {
// Save value
},
),
)
// Validate form
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
// Process form
}
Form
Container for form fields with validation.
final _formKey = GlobalKey<FormState>();
Form(
key: _formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
onChanged: () {
// Handle form change
},
child: Column(
children: [
TextFormField(...),
TextFormField(...),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
// Form is valid
}
},
child: const Text('Submit'),
),
],
),
)
InputDecoration
Customize input appearance.
InputDecoration(
labelText: 'Label',
labelStyle: const TextStyle(color: Colors.blue),
hintText: 'Hint',
helperText: 'Helper text',
errorText: 'Error text',
prefixIcon: const Icon(Icons.person),
suffixIcon: IconButton(
icon: const Icon(Icons.clear),
onPressed: () {},
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.grey),
borderRadius: BorderRadius.circular(8),
),
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.blue, width: 2),
borderRadius: BorderRadius.circular(8),
),
errorBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.red),
borderRadius: BorderRadius.circular(8),
),
filled: true,
fillColor: Colors.grey[100],
)
TextEditingController
Control text field value programmatically.
final controller = TextEditingController(text: 'Initial value');
TextField(
controller: controller,
)
// Update value
controller.text = 'New value';
// Listen to changes
controller.addListener(() {
print('Text: ${controller.text}');
});
// Dispose controller
@override
void dispose() {
controller.dispose();
super.dispose();
}
Input Types
// Email
keyboardType: TextInputType.emailAddress
// Number
keyboardType: TextInputType.number
// Phone
keyboardType: TextInputType.phone
// URL
keyboardType: TextInputType.url
// Multiline
maxLines: null,
keyboardType: TextInputType.multiline
Key Points
- Use
TextFieldfor simple text input - Use
TextFormFieldfor validated input - Wrap fields in
Formfor form validation - Use
TextEditingControllerto control text value - Customize appearance with
InputDecoration - Set
keyboardTypefor appropriate keyboard - Use
validatorfor input validation - Call
dispose()on controllers to prevent memory leaks