Клавиша ввода флаттера для TextFormField, игнорирует изменение фокуса - PullRequest
1 голос
/ 23 марта 2020

У меня есть диалоговое окно с трепетом TextFormField. Я хотел обработать пользователя в сети, нажав Enter, чтобы принять значение в поле. Метод onFieldSubmitted () работает для этого, но на самом деле работает очень хорошо. Если они даже снимают фокус с поля, это срабатывает. Я действительно хочу, чтобы вызвать только для клавиши ввода. Должен ли я использовать RawKeyboardListener () для этого? Или есть какой-то способ узнать, что это не клавиша Enter, а изменение фокуса, которое вызвало onFieldSubmitted ()? Вот мой пример кода для диалога. CustomTextField - это только я, расширяющий TextFormField, чтобы каждый раз выглядеть определенным образом.

  var res = await showDialog<String>(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Row(
          children: <Widget>[
            Text('Add '),
            Container(
              width: 8,
            ),
            DropdownButton(
              value: _currentAddType,
              items: _addTypeDropDownMenuItems,
              onChanged: (value) => _changeAddType(value),
            ),
          ],
        ),
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(8.0))),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              CustomTextField(
                controller: _roomNameController,
                textCapitalization: TextCapitalization.words,
                autoFocus: true,
                icon: Icon(Icons.text_fields),
                hint: "Room Name",
                onFieldSubmitted: (value) => { // <======== this is the problem, it works even if just losing focus
                  setState(() {
                    Navigator.of(context).pop('Add');
                  })
                },
              ),
              Container(
                height: 12,
              ),
              Text(
                'Select Gateway:',
                style: Theme.of(context).textTheme.headline6,
              ),
              Container(
                height: 4,
              ),
              DropdownButton(
                value: _currentGateway,
                items: _gatewayDropDownMenuItems,
                onChanged: (String gateway) {
                  _currentGateway = gateway;
                  setState(() {
                    Navigator.of(context)
                        .pop(); 
                  });
                  _addGatewayOrRoom();
                },
              ),
            ],
          ),
        ),
        actions: <Widget>[
          FlatButton(
            child: Text('Cancel'),
            onPressed: () {
              setState(() {
                Navigator.of(context).pop('Cancel');
              });
            },
          ),
          Container(
            width: 20,
          ),
          FlatButton(
            child: Text('Add'),
            onPressed: () {
              setState(() {
                Navigator.of(context).pop('Add');
              });
            },
          ),
        ],
      );
    },
  );
  if (res == 'Add') {
    await doAddRoom();
    _doRefresh();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...