dart 怎样听扑动中的焦点变化?

v6ylcynt  于 2023-01-10  发布在  其他
关注(0)|答案(3)|浏览(115)

在Android中,我们可以调用setOnFocusChangeListener(),在onFocusChanged()方法中做一些事情,但是flutter不提供onFocus()接口,如GestureDetector中的onTap()或RawKeyboardListener中的onKey()
我看过flutter api关于focus的文章,https://api.flutter.dev/flutter/widgets/FocusManager-class.html,但是我找不到一个方法来实现我的请求,谁能给予我一把?

czq61nw1

czq61nw11#

此外,您还可以使用Focus小工具。

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

tzcvj98z2#

使用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);
  }
}
vwkv1x7d

vwkv1x7d3#

我想你正在寻找FocusNode类,使用addListener方法添加一个监听焦点变化的监听器函数。

    • 示例**

声明和定义FocusNode

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

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

TextField(
            focusNode: focusNode,
          ),
    • 产出**

当文本字段是焦点时,您将得到true else false

相关问题