如何听颤振中的焦点变化?



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

我已经阅读了关于焦点的颤振 api,https://api.flutter.dev/flutter/widgets/FocusManager-class.html 但是我找不到实现我请求的方法,谁能帮我一把?

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

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

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

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

example
声明和定义FocusNode

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

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

TextField(
focusNode: focusNode,
),

输出

当文本字段是焦点时,你会得到真,否则假

class FocusChange {
static void fieldFocusChange(BuildContext context, FocusNode 
currentFocusNode,
FocusNode nextFocusNode) {
currentFocusNode.unfocus();
FocusScope.of(context).requestFocus(nextFocusNode);
}
}

最新更新