flutter - onEditingComplete 在 unfocus 后不被调用
问题描述
我有一个这样的 TextField。附加代码是必要的,以表明在不同的情况下,我会进行各种焦点操作。
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,
));
如您所见,我有要运行的功能onEditingComplete
。但是,只有当我按下键盘上的Next
或按钮(或模拟器中的 Enter 键)时才会调用它。Done
如果我通过点击不同的字段来更改焦点,则不会调用此函数。
我尝试使用Focus
orFocusNode
来帮助解决这个问题,但是当我这样做时,onEditingComplete
函数本身不再起作用。
当一切都很好地结合在一起时,我怎样才能在这里获得想要的效果?
解决方案
焦点小部件
在小部件中包装字段Focus
可能会奏效。
该Focus
小部件将捕获儿童的焦点丢失事件。使用它的onFocusChange
参数,您可以调用任意函数。
同时,onEditingComplete
TextField 的参数不受影响,仍然会在软键盘“Next/Done”按键上调用。
这应该处理“下一步/完成”按键和用户点击另一个字段的字段焦点丢失。
import 'package:flutter/material.dart';
class TextFieldFocusPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ↓ Add this wrapper
Focus(
child: TextField(
autofocus: true,
decoration: InputDecoration(
labelText: 'Name'
),
textInputAction: TextInputAction.next,
// ↓ Handle focus change on Next / Done soft keyboard keys
onEditingComplete: () {
print('Name editing complete');
FocusScope.of(context).nextFocus();
},
),
canRequestFocus: false,
// ↓ Focus widget handler e.g. user taps elsewhere
onFocusChange: (hasFocus) {
hasFocus ? print('Name GAINED focus') : print('Name LOST focus');
},
),
TextField(
decoration: InputDecoration(
labelText: 'Password'
),
),
],
),
),
),
);
}
}
推荐阅读
- twitter-bootstrap - 隐藏在黑色叠加层下的 Bootstrap 模态弹出视频
- flutter - 没有为类 'String' 定义 getter 'todoText'
- graphql - 灯塔嵌套突变 FK 字段未填充
- python - 如何调用一个简单的函数并同时运行以下行?
- angular - ASP .Net Core 3.1 Angular 模板不起作用
- drupal-8 - 视图将字段暴露过滤器与多个分类术语结合在一起 Drupal 8
- python - num[:] 和 num 有什么区别?
- python - 如何使用 Selenium Webdriver 自动分页?
- react-native - 将原生视频反应为 GL 纹理
- regex - 使用正则表达式搜索一组单词,找到一些但不是全部