Как сместить фокус на следующее текстовое поле во флаттере? - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок во Флаттере.

Я строю форму с несколькими текстовыми вводами, используя следующие виджеты: Form, TextFormField. Появляющаяся клавиатура не отображает действие поля «следующий» (которое должно сместить фокус на следующее поле), вместо этого это действие «сделано» (которое скрывает keyborad).

Я искал любые подсказки в официальных документах, не нашел ничего, что можно было бы сделать напрямую. Хотя я приземлился на FocusNode ( поваренная книга , api doc ). Он предоставляет механизм для смещения фокуса с помощью какой-либо кнопки или любого другого действия в приложении, но я хочу, чтобы он был на клавиатуре .

1 Ответ

0 голосов
/ 03 сентября 2018

Нашли способ добиться этого.

  1. Отображение следующего значка вместо Готово - установка параметра textInputAction на TextInputAction.next

  2. Использование обратного вызова onFieldSubmitted для запроса узла фокуса следующего поля.

    class FormWidget extends StatelessWidget{    
       final focus = FocusNode();
       @override
       Widget build(BuildContext context) {
        return Form(
          child: SingleChildScrollView(
            padding: EdgeInsets.symmetric(horizontal: 16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                TextFormField(
                  textInputAction: TextInputAction.next,
                  autofocus: true,
                  decoration: InputDecoration(labelText: "Input 1"),
                  onFieldSubmitted: (v){
                    FocusScope.of(context).requestFocus(focus);
                  },
                ),
                TextFormField(
                  focusNode: focus,
                  decoration: InputDecoration(labelText: "Input 2"),
                ),
              ],
            ),
          ),
        );
      }
    }
    

Редактировать: как указано в документации (flutter.io/docs/cookbook/forms/focus), - нам также необходимо управлять жизненным циклом FocusNode. Итак, init FocusNode в методе init () и распоряжаться в dispose () родительского виджета. - @ АнтонДеревянко

...