Как прослушать изменение фокуса?

В Android мы можем вызвать setOnFocusChangeListener(), сделать что-нибудь в onFocusChanged(), но flutter не предоставляет интерфейс onFocus() такой как onTap() в GestureDetector или onKey() в RawKeyboardListener.

Я прочитал API флаттера о фокусе, https://docs.flutter.io/flutter/widgets/FocusManager-class.html, но я не могу найти способ выполнить мою просьбу, кто-нибудь, кто может мне помочь?

Ответ 1

Я полагаю, вы ищете класс FocusNode. Используйте метод addListener для добавления функции слушателя, которая прослушивает изменение фокуса.

Ответ 2

Вот простой рабочий пример FocusNode с использованием TextField.

Widget build(BuildContext context) {  
    ...  
    var _focusNode = new FocusNode();
    var _textField = new TextField(
       focusNode: _focusNode
    );
    _focusNode.addListener(() {
       if (!_focusNode.hasFocus) {
          // TextField has lost focus
       }
    });
    ...
}

Ответ 3

Здесь полностью правильный ответ. addListener в initState(), а не build(), потому что это может вызвать многократные вызовы слушателя.

class _SomeWidgetState extends State<SomeWidget> {
  final FocusNode _focusNode = FocusNode();

  @override
  void initState() {
    super.initState();
    _focusNode.addListener(() {
      print("Has focus: ${_focusNode.hasFocus}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return TextField(focusNode: _focusNode);
  }

  @override
  void dispose() {
    _focusNode.dispose();
    super.dispose();
  }
}