web-dev-qa-db-fra.com

Comment écouter le changement de focus en flutter?

Sous Android, nous pouvons appeler setOnFocusChangeListener(), faire quelque chose dans la méthode onFocusChanged(), mais flutter ne fournit pas d'interface onFocus() comme onTap() dans GestureDetector ou onKey() dans RawKeyboardListener.

J'ai lu l'API Flutter sur la mise au point, https://docs.flutter.io/flutter/widgets/FocusManager-class.html mais je ne trouve pas de moyen de réaliser ma demande, quiconque le peut donne-moi un coup de main?

14
coder.john

Je suppose que vous recherchez FocusNode class. Utilisez la méthode addListener pour ajouter une fonction d'écoute qui écoute le changement de focus.

5
Hemanth Raj

Voici un exemple de travail simple de FocusNode en utilisant un TextField.

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

Voici la réponse entièrement correcte. addListener doit être dans initState(), pas build(), car cela entraînerait l'ajout d'un écouteur à chaque fois qu'un widget est construit et vous ne voulez probablement pas cela.

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();
  }
}
12
Albert221