如何聆听颤动中的焦点变化?

How to listen focus change in flutter?

在Android中,我们可以调用setOnFocusChangeListener(),在onFocusChanged()方法中做一些事情,但是flutter不提供onFocus()像GestureDetector中的onTap()接口或 RawKeyboardListener 中的 onKey()

我读过关于 focus 的 flutter api,https://docs.flutter.io/flutter/widgets/FocusManager-class.html 但是我找不到实现我的请求的方法,谁能帮帮我?

我想您正在寻找 FocusNode class。使用addListener方法添加监听焦点变化的监听函数。

例子
声明并定义 FocusNode

 var focusNode = FocusNode();
  @override
  void initState() {
    focusNode.addListener(() {
      print(focusNode.hasFocus);
    });
    super.initState();
  }

在文本字段中使用焦点节点

TextField(
            focusNode: focusNode,
          ),

输出

当文本框成为焦点时,你会得到 true 否则 false

使用FocusNode

这是一个完全正确的答案。 addListener 应该在 initState() 中,而不是 build(),因为这会导致每次构建小部件时都添加一个侦听器,而您很可能不希望这样。

import 'package:flutter/material.dart';

class SomeWidget extends StatefulWidget {
  @override
  _SomeWidgetState createState() => _SomeWidgetState();
}

class _SomeWidgetState extends State<SomeWidget> {
  final _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();
  }
}

使用flutter_hooks

如果您有机会使用 flutter_hooks 软件包,这里有一个专用的 useFocusNode 挂钩。

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

class SomeWidget extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final focusNode = useFocusNode();
    useEffect(() {
      focusNode.addListener(() {
        print("Has focus: ${focusNode.hasFocus}");
      });
      return; // You need this return if you have missing_return lint
    }, [focusNode]);

    return TextField(focusNode: focusNode);
  }
}

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

Focus(
  child: TextFormField(...),
  onFocusChange: (hasFocus) {
    if(hasFocus) {
      // do stuff
    }
  },
)