如何在Flutter(Web)的文本字段中放弃Backspace键按下事件



我正在创建一个Flutter web应用程序。要求是在特定条件下,我必须阻止用户在Textfield中键入某些文本时按退格键(或删除键(。我试过RawKeyboardListenerTextEditingController。它们可以帮助我监听键盘事件,但我无法修改或丢弃键盘事件。

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

最新更新