This commit is contained in:
Phuoc Nguyen
2025-10-10 17:36:10 +07:00
parent 04f7042b8d
commit bdaf0b96c5
82 changed files with 4753 additions and 329 deletions

View File

@@ -0,0 +1,78 @@
import 'package:flutter/material.dart';
/// Password field with show/hide toggle
class PasswordField extends StatefulWidget {
const PasswordField({
super.key,
required this.controller,
required this.label,
this.hint,
this.validator,
this.textInputAction,
this.onFieldSubmitted,
this.enabled = true,
this.autofocus = false,
});
final TextEditingController controller;
final String label;
final String? hint;
final String? Function(String?)? validator;
final TextInputAction? textInputAction;
final void Function(String)? onFieldSubmitted;
final bool enabled;
final bool autofocus;
@override
State<PasswordField> createState() => _PasswordFieldState();
}
class _PasswordFieldState extends State<PasswordField> {
bool _obscureText = true;
void _toggleVisibility() {
setState(() {
_obscureText = !_obscureText;
});
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return TextFormField(
controller: widget.controller,
validator: widget.validator,
obscureText: _obscureText,
textInputAction: widget.textInputAction,
onFieldSubmitted: widget.onFieldSubmitted,
enabled: widget.enabled,
autofocus: widget.autofocus,
style: theme.textTheme.bodyLarge,
decoration: InputDecoration(
labelText: widget.label,
hintText: widget.hint,
prefixIcon: Icon(
Icons.lock_outline,
color: theme.colorScheme.primary,
),
suffixIcon: IconButton(
icon: Icon(
_obscureText ? Icons.visibility : Icons.visibility_off,
color: theme.colorScheme.onSurface.withOpacity(0.6),
),
onPressed: _toggleVisibility,
),
labelStyle: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withOpacity(0.7),
),
hintStyle: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withOpacity(0.4),
),
errorStyle: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.error,
),
),
);
}
}