我在 TextFormField 中编写了此代码,用于处理转到下一个框,但只有当输入框完成时它才会返回。
onChanged: (value) {
if (value.length == 1 && index < 5) {
FocusScope.of(context).nextFocus();
}
if ((controllers[index].text.isEmpty || value.isEmpty) &&
index > 0) {
FocusScope.of(context).previousFocus();
}
setState(() {});
},
假设我在输入过程中想返回。我该怎么做?
我假设您正在使用多个文本字段来记录 otp 的每个字符,问题是由于每个 otp 输入框都是空的,退格键不会删除任何内容,因此不会触发onChanged
为了检测退格键,您可以在每个输入中初始化一个字符,以便退格键将删除它并触发onChanged,在我的情况下,我使用了一个零宽度字符'\u200b',因此用户看不到它
例子:
在上面的代码中,otpInputWidget 是单独的输入框,我用 focusNode 监听器对其进行初始化,当其为空时添加一个零宽度字符,如果之前已被删除则将其添加回来。
此外,由于输入框现在有一个字符,我们不想向输入中添加字符,而是想用新字符覆盖现有字符,通过选择文本,输入将覆盖它,这就是为什么我在侦听器中有一个_selectAllText()来选择输入的文本(只要它聚焦)
_selectAllText() 的定义:
并在文本字段中切换焦点:
*在将最终的完整 OTP 发送去验证之前,您应该记得对其进行清理,删除多余的零宽度字符:
以下是完整代码: