当文本字段在 Flutter 中退出焦点(模糊)时,如何捕获事件?
How can I catch event when a text field is exiting focus (on blur) in Flutter?
我查看了 TextFormField,这里的字段不是我需要的:
onChanged
(在按下每个键后调用,我需要在用户已经完成并退出 TextFormField 焦点时调用)
onEditingComplete
(在用户按下完成键或类似键后调用,但用户可以在不点击这些按钮的情况下退出 TextFormField 焦点)
onSave
(在调用 form.save()
之后调用。但我需要在用户完成编辑后执行此操作,让用户知道该应用程序会“自动更正”用户输入的内容)
validator
(也在 form.validate()
上调用,就在 form.save()
之前。不是我需要的)
我需要在用户退出焦点(关闭键盘或点击另一个文本字段)时进行处理,让用户看到他们的输入正在调整并处理为“正确的输入”。我怎样才能赶上这样的事件?
通过使用 FocusNode class,您可以添加一个焦点侦听器并可以捕获焦点变化。
通过使用 Focus class,您只需包装 TextField 并添加一个 onFocusChange 参数。
[解决方案 1]
- 添加一个定义的 FocusNode 实例
FocusNode focusNode = FocusNode();
- 在 initState 添加 FocusNode 的监听器。
focusNode.addListener(() {
print('1: ${focusNode.hasFocus}');
});
- 将 FocusNode 实例添加到 TextField 的 focusNode 参数。
TextField(
focusNode: focusNode,
)
[解法二]
- 通过焦点小部件换行 TextField
Focus(
child: TextField(),
onFocusChange: (hasFocus) {
print('2: $hasFocus');
},
)
[完整代码示例]
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
FocusNode focusNode = FocusNode();
@override
void initState() {
super.initState();
focusNode.addListener(() {
print(focusNode.hasFocus);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _buildBody(),
);
}
Widget _buildBody() {
return TextField(
focusNode: focusNode,
);
}
}
我查看了 TextFormField,这里的字段不是我需要的:
onChanged
(在按下每个键后调用,我需要在用户已经完成并退出 TextFormField 焦点时调用)onEditingComplete
(在用户按下完成键或类似键后调用,但用户可以在不点击这些按钮的情况下退出 TextFormField 焦点)onSave
(在调用form.save()
之后调用。但我需要在用户完成编辑后执行此操作,让用户知道该应用程序会“自动更正”用户输入的内容)validator
(也在form.validate()
上调用,就在form.save()
之前。不是我需要的)
我需要在用户退出焦点(关闭键盘或点击另一个文本字段)时进行处理,让用户看到他们的输入正在调整并处理为“正确的输入”。我怎样才能赶上这样的事件?
通过使用 FocusNode class,您可以添加一个焦点侦听器并可以捕获焦点变化。
通过使用 Focus class,您只需包装 TextField 并添加一个 onFocusChange 参数。
[解决方案 1]
- 添加一个定义的 FocusNode 实例
FocusNode focusNode = FocusNode();
- 在 initState 添加 FocusNode 的监听器。
focusNode.addListener(() {
print('1: ${focusNode.hasFocus}');
});
- 将 FocusNode 实例添加到 TextField 的 focusNode 参数。
TextField(
focusNode: focusNode,
)
[解法二]
- 通过焦点小部件换行 TextField
Focus(
child: TextField(),
onFocusChange: (hasFocus) {
print('2: $hasFocus');
},
)
[完整代码示例]
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
FocusNode focusNode = FocusNode();
@override
void initState() {
super.initState();
focusNode.addListener(() {
print(focusNode.hasFocus);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _buildBody(),
);
}
Widget _buildBody() {
return TextField(
focusNode: focusNode,
);
}
}