我正在创建一个Flutter web应用程序。要求是在特定条件下,我必须阻止用户在Textfield中键入某些文本时按退格键(或删除键(。我试过RawKeyboardListener
和TextEditingController
。它们可以帮助我监听键盘事件,但我无法修改或丢弃键盘事件。
RawKeyboardListener(
focusNode: focusNode,
onKey: handleOnKeyEvent,
child: TextField(
textAlignVertical: TextAlignVertical.top,
textInputAction: TextInputAction.newline,
controller: textEditingController,
decoration: InputDecoration(
border: InputBorder.none, hintText: 'Start typing here'),
keyboardType: TextInputType.multiline,
minLines: null,
maxLines: null,
expands: true,
onChanged: (value) {
//print('text = $value');
handleUserInput(value);
},
),
),
对我来说,TextField.onChange()
和TextController
回调不起作用。
经过一番搜索,我得到了Sonu simon的GitHub答案
https://github.com/flutter/flutter/issues/14809#issuecomment-907617733
基本上,它说用RawKeyboardListener
小部件包装TextField。它有一个onKey
回调,RawKeyEvent
作为参数传入。
我用过它,它对我有用。
if (value.data.logicalKey.keyLabel == "Backspace") {
// stuff here...
}
作为回答,Sonu Simon解释使用keyId
属性(以验证按下的退格(,但我认为每个平台都不同。所以我使用了keyLabel
属性。
使用TextController
检查文本是否已退格如何?
通过这种方式,用户仍然可以键入新字符,但无法删除它们。
late String initialText;
late TextEditingController _textController;
void initState() {
initialText = "MyText";
_textController = TextEditingController(text: initialText);
super.initState();
}
并且在build()
:内部
TextFormField(
controller: _textController,
onChanged: (input) {
if (_textController.text.length < initialText.length) {
_textController.text = initialText;
} else {
setState(() {
initialText = _textController.text;
});
}
},
)
在iOS上,似乎不可能听退格键盘敲击。
当字段为空时,我触发TextField的onChanged的解决方案是使用不可见的字符:
const String invisibleChar = 'u200B';
将其作为文本编辑控制器的默认值
TextEditingController(text: invisibleChar);
如果您使用模糊的文本pin,它可能会导致不良行为,比如为这个不可见的字符显示模糊的符号。解决方案是只有当控制器的值不是不可见字符时才模糊:
TextFormField(
obscureText: controller?.text != invisibleChar
)
别忘了,如果字段有一个值,然后用退格按钮再次变为空,则应该将该值重新初始化为invisibleChar:
controller?.addListener(() {
if (widget.controller?.text.isEmpty ?? true) {
controller?.text = invisibleChar;
onBackspaceTap?.call(); //do your action on backspace tap
}
});