如何在颤动时听取焦点变化?

cod*_*ohn 16 focus dart flutter

在Android中,我们可以调用setOnFocusChangeListener(),在onFocusChanged()方法中执行某些操作,但是flutter不会onFocus()onTap()GestureDetector或onKey()RawKeyboardListener 中那样提供接口.

我已经阅读了关于焦点的flutter api,https://docs.flutter.io/flutter/widgets/FocusManager-class.html 但我无法找到实现我的请求的方法,任何人都可以帮我一臂之力?

Bam*_*oUA 88

此外,您可以使用Focus小部件。

Focus(
  child: TextFormField(...),
  onFocusChange: (hasFocus) {
    if(hasFocus) {
      // do stuff
    }
  },
)
Run Code Online (Sandbox Code Playgroud)

  • 当然比必须设置和维护“FocusNode”实例更干净。这篇文章有一个合适的例子。看来这可能是现在公认的答案。很好,谢谢 (7认同)
  • 这家伙很棒 (5认同)
  • 如果您点击返回,则不会触发此操作。 (2认同)
  • 我附议这个声明 (2认同)
  • 这应该被标记为答案。工作轻松快捷。 (2认同)
  • 它绝对更干净,但取决于用例。如果我们有多个输入字段,为每个输入字段维护一个焦点节点会更好。 (2认同)

Ste*_*ane 19

这是使用TextField 的FocusNode的简单工作示例.

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

  • 不要在构建方法中添加一个监听器,在`initState`中执行它 (18认同)

Alb*_*221 16

这是完全正确的答案。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();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • *注意:* 节点焦点侦听器被调用两次:当它获得焦点时和当它失去焦点时。在回调函数“node.hasFocus”中分别为“true”或“false” (9认同)
  • @raphire 不,不需要。在“ChangeNotifer”(即“FocusNode”)中通知侦听器在处置后是非法的 (2认同)
  • @KarolinaHagegård“useFocusNode”是一个钩子,它返回“FocusNode”,但也管理其生命周期。它就像带有“initState”和“dispose”的第一个片段,但隐藏在一个钩子内,如下所示:https://github.com/rrousselGit/flutter_hooks/blob/master/packages/flutter_hooks/lib/src/focus .dart#L50-L79 (2认同)

Hem*_*Raj 5

我想你正在寻找FocusNode类.使用addListener方法添加侦听焦点更改的侦听器函数.

  • 你能举个例子吗 (2认同)
  • 请举个例子 (2认同)