Forms Trim()在颤振应用程序中,默认情况下表单中任何文本字段的输入值
我有不同的表单字段,我希望在触发Forms Trim()在颤振应用程序中,默认情况下表单中任何文本字段的输入值,forms,flutter,input,dart,trim,Forms,Flutter,Input,Dart,Trim,我有不同的表单字段,我希望在触发validator方法之前,在默认情况下修剪表单字段的每个值 我想实现这一点的原因是,如果在触发验证程序方法时对输入值运行regex,则regex将在Input\u text.hasMatch上返回false,因为输入值末尾有一个无用的空格字符 比如说。由于输入值末尾有一个无用的额外空格字符,因此alphaNumericText.hasMatch(val)上的以下代码将返回false final alphaNumericText=RegExp(r'^[a-zA-Z
validator
方法之前,在默认情况下修剪表单字段的每个值
我想实现这一点的原因是,如果在触发验证程序
方法时对输入值运行regex
,则regex将在Input\u text.hasMatch
上返回false,因为输入值末尾有一个无用的空格字符
比如说。由于输入值末尾有一个无用的额外空格字符,因此alphaNumericText.hasMatch(val)
上的以下代码将返回false
final alphaNumericText=RegExp(r'^[a-zA-Z0-9]+$);
TextFormField(
键盘类型:TextInputType.text,
装饰:新的输入装饰(
labelText:“输入您的昵称”,
),
验证器:(val){
如果(val.isEmpty==true){
return“需要昵称!”;
}
if(alphaNumericText.hasMatch(val)=false){
返回“仅在昵称中使用字母数字字符”;
}
返回null;
},
onSaved:(val)=>this.昵称=val,
),
注意我不想通过修改alphaNumericText RegExp
来实现这一点,以在输入值的末尾保留额外的空格。我不想这样做
我想要的是在调用
验证程序
方法之前,默认情况下对表单中所有文本字段中的每个值进行验证。在回调时修剪文本值,并将其分配回控制器 正如@Darish所建议的,下面是它的示例代码
但需要注意的是,如果修剪,则需要在文本的末尾进行选择。这仅在不允许使用间距的情况下有效
class\u MyHomePageState扩展状态{
最终字母数字文本=RegExp(r'^[a-zA-Z0-9]+$);
final textController=TextEditingController();
@凌驾
无效处置(){
super.dispose();
textController?.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子项:TextFormField(
控制器:textController,
键盘类型:TextInputType.text,
装饰:新的输入装饰(
labelText:“输入您的昵称”,
),
一旦更改:(val){
最终修剪值=修剪值();
如果(val!=trimVal)
设置状态(){
textController.text=trimVal;
textController.selection=TextSelection.fromPosition(TextPosition(偏移量:trimVal.length));
});
},
验证器:(val){
如果(val.isEmpty==true){
return“需要昵称!”;
}
if(alphaNumericText.hasMatch(val)=false){
返回“仅在昵称中使用字母数字字符”;
}
返回null;
},
),
),
);
}
}
只需添加
inputFormatters: [WhitelistingTextInputFormatter(RegExp(r'[a-zA-Z0-9]'))],
作为TextInputField的属性
用户甚至不能输入空格或任何其他字符,除非是白名单
您还可以从验证器中删除其他检查
完整示例
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: Center(
child: TextFormField(
inputFormatters: [WhitelistingTextInputFormatter(RegExp(r'[a-zA-Z0-9]'))],
keyboardType: TextInputType.text,
decoration: new InputDecoration(
labelText: 'Enter your nickname',
),
validator: (val) {
if (val.isEmpty == true) {
return 'Nickname is required!';
}
return null;
},
onSaved: (val) {},
),
),
),
),
);
}
}
我在验证函数中使用了以下逻辑。我通过包装TextFormField
创建了自定义无状态小部件。因为我想在我的应用程序中使用相同的样式TextFormField
validator
是我传递给无状态小部件的函数
validator: (value) {
if(validator != null){
if(obscureText){
return validator(value);
}else{
return validator(value.trim());
}
}
return null;
},
您可以在onFieldSubmitted
和onSaved
中使用相同的逻辑。当设置obsolizeText
为true
时,将忽略修剪。因为我们不希望修改密码。WhiteListingDemiPutFormatter不推荐使用,请改用FilteringDemiPutFormatter。