Irbisa · Шпаргалка
Формы, ввод и фокус
TextField, TextEditingController, валидация Form, FocusNode, форматтеры ввода, клавиатура
Что такое
TextEditingControllerи почему его нужно создавать вState, а не вbuild?class NameField extends StatefulWidget { const NameField({super.key}); @override State<NameField> createState() => _NameFieldState();}…Чем
TextFieldотличается отTextFormField?Как валидировать форму во Flutter: за что отвечают
Form,GlobalKey<FormState>иvalidator?class _LoginFormState extends State<LoginForm> { final _formKey = GlobalKey<FormState>(); String _email = ''; void _submit() { final form = _formKey.currentState!;…Чем отличаются
onChanged,onSubmittedи слушательTextEditingController?class _SearchState extends State<Search> { final _query = TextEditingController(); String _last = ''; @override void initState() {…Что делают
labelText,hintText,helperTextиerrorTextвInputDecorationи почему форма «прыгает», когда появляется ошибка?За что отвечают параметры
keyboardType,textInputActionиtextCapitalizationу поляTextField?Что делает
Scaffold.resizeToAvoidBottomInsetи почему клавиатура всё равно может закрыть кнопку формы?Scaffold( // resizeToAvoidBottomInset: true is the default; leave it on body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column(…validate()прошёл, вы вызвалиsave(), а модель всё равно пустая. ГдеFormна самом деле хранит значения?class _CheckoutState extends State<Checkout> { final _formKey = GlobalKey<FormState>(); var _order = const Order(); void _submit() { final form = _formKey.currentState!;…Найдите баг: форма редактирования профиля показывает пустое поле Name даже после того, как профиль загрузился.
class _ProfileFormState extends State<ProfileForm> { Profile? _profile; @override void initState() { super.initState(); widget.repo.load().then((p) { if (mounted) setState(() => _profile = p); }); } @override Widget build(BuildContext context) => TextFormField( initialValue: _profile?.name, decoration: const InputDecoration(labelText: 'Name'), );}Форма регистрации открывается уже вся в красных ошибках. Какой
autovalidateModeэто даёт и что использовать вместо него?Ошибку сервера «email уже зарегистрирован» показывают так, и она остаётся после того, как пользователь исправил email. Почему и как исправить?
String? _serverError; // set when the API rejects the email TextFormField( controller: _email, autovalidateMode: AutovalidateMode.onUserInteraction, decoration: InputDecoration( labelText: 'Email', errorText: _serverError, ), validator: (v) => (v ?? '').contains('@') ? null : 'Enter a valid email',)Что такое
FocusNodeи как перевести фокус на следующее поле и скрыть клавиатуру?class _LoginState extends State<Login> { final _password = FocusNode(); void _hideKeyboard(PointerDownEvent _) => FocusManager.instance.primaryFocus?.unfocus();…На клавиатуре есть клавиша Next, но после нажатия курсор остаётся в поле email. Что не так с этим кодом?
Column( children: [ TextField( controller: _email, textInputAction: TextInputAction.next, onEditingComplete: _saveDraft, ), TextField(controller: _password, obscureText: true), ],)Как сделать маску ввода через
TextInputFormatterи почему каретка после каждого нажатия прыгает в конец?class ThousandsFormatter extends TextInputFormatter { @override TextEditingValue formatEditUpdate(TextEditingValue old, TextEditingValue next) { final digits = next.text.replaceAll(RegExp(r'\D'), ''); if (digits.isEmpty) return const TextEditingValue();…validatorобязан быть синхронным. Как показывать серверную проверку вроде «имя занято», пока пользователь печатает?class _UsernameFieldState extends State<UsernameField> { Timer? _debounce; int _request = 0; String? _taken; // what the synchronous validator hands back void _onChanged(String value) { _taken = null; // the old verdict was about the old text…Выбор даты стоит внутри
Form, ноvalidate()его игнорирует, аsave()не видит значение. Как сделать нетекстовый виджет настоящим полем формы?class DateFormField extends FormField<DateTime> { DateFormField({ super.key, super.initialValue, super.validator, super.onSaved,…Менеджер паролей ОС не предлагает ни заполнить, ни сохранить форму входа, а код из SMS вводят руками. Что нужно автозаполнению во Flutter?
AutofillGroup( // these fields are ONE credential child: Column( children: [ TextField( controller: _email, autofillHints: const [AutofillHints.username], // not .email…Поле поиска управляется Bloc-ом, при быстром наборе теряются символы, а каретка прыгает в конец. Кто должен владеть текстом?
class _SearchFieldState extends State<SearchField> { final _ctrl = TextEditingController(); @override void dispose() { _ctrl.dispose();…Текст, введённый в форму, пропадает после поворота телефона. Что было уничтожено и когда на самом деле нужен
RestorableTextEditingController?class _SignupPageState extends State<SignupPage> with RestorationMixin { // survives process death; a plain controller survives only rebuilds final _email = RestorableTextEditingController(); @override String? get restorationId => 'signup'; // null opts this subtree out…Форма из 30 полей на
ListView.builderтеряет введённые значения и сообщения об ошибках, как только поле уезжает за экран. В чём причина и что менять?class _LongFormState extends State<LongForm> { final _formKey = GlobalKey<FormState>(); // the page owns the values; a row is just a view of one late final Map<String, TextEditingController> _ctrls = { for (final f in widget.fields) f.id: TextEditingController(text: f.initial), };…Этот форматтер, переводящий текст в верхний регистр, портит слова при наборе с предиктивной клавиатурой и японским IME. Что такое
TextEditingValue.composingи что здесь не так?class ShoutFormatter extends TextInputFormatter { @override TextEditingValue formatEditUpdate(TextEditingValue old, TextEditingValue next) { return TextEditingValue( text: next.text.toUpperCase(), selection: next.selection, composing: next.composing, ); }}