我有一个像这样的文本字段。额外的代码是必要的,以表明在不同的情况下,我会进行各种焦点操作。
final node = FocusScope.of(context);
Function cleanInput = () => {controller.text = controller.text.trim()};
Function onEditingComplete;
Function onSubmitted
TextInputAction textInputAction;
if (!isLast) {
onEditingComplete = () => {
cleanInput(),
node.nextFocus(),
};
onSubmitted = (_) => {cleanInput()};
textInputAction = TextInputAction.next;
} else {
onEditingComplete = () => {
cleanInput(),
};
onSubmitted = (_) => {
cleanInput(),
node.unfocus(),
};
textInputAction = TextInputAction.done;
}
Widget textInput = TextField(
textInputAction: textInputAction,
controller: controller,
onEditingComplete: onEditingComplete,
onSubmitted: onSubmitted,
keyboardType: textInputType,
));
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有我想要运行的函数onEditingComplete。Next但是,只有当我按下键盘上的或Done按钮(或模拟器中的 Enter 键)时,才会调用此函数。如果我通过点击不同的字段来改变焦点,则不会调用此函数。
我尝试过使用Focus或FocusNode来帮助解决此问题,但是当我这样做时,该onEditingComplete函数本身不再起作用。
当一切都很好地配合时,我怎样才能在这里获得所需的效果?
Bak*_*ker 10
将字段包装在小部件中Focus可能会达到目的。
该Focus小部件将捕获儿童的焦点丢失事件。通过它的onFocusChange参数你可以调用任意函数。
同时,onEditingCompleteTextField 的参数不受影响,仍会在软件键盘“Next/Done”按键上调用。
这应该可以处理“下一步/完成”按键和用户点击另一个字段时的字段焦点丢失问题。
\nimport 'package:flutter/material.dart';\n\nclass TextFieldFocusPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Scaffold(\n body: SafeArea(\n child: Container(\n padding: EdgeInsets.symmetric(horizontal: 20),\n child: Column(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n // \xe2\x86\x93 Add this wrapper\n Focus(\n child: TextField(\n autofocus: true,\n decoration: InputDecoration(\n labelText: 'Name'\n ),\n textInputAction: TextInputAction.next,\n // \xe2\x86\x93 Handle focus change on Next / Done soft keyboard keys\n onEditingComplete: () {\n print('Name editing complete');\n FocusScope.of(context).nextFocus();\n },\n ),\n canRequestFocus: false,\n // \xe2\x86\x93 Focus widget handler e.g. user taps elsewhere\n onFocusChange: (hasFocus) {\n hasFocus ? print('Name GAINED focus') : print('Name LOST focus');\n },\n ),\n TextField(\n decoration: InputDecoration(\n labelText: 'Password'\n ),\n ),\n ],\n ),\n ),\n ),\n );\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5403 次 |
| 最近记录: |