在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);
}
}