Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Trim()在颤振应用程序中,默认情况下表单中任何文本字段的输入值_Forms_Flutter_Input_Dart_Trim - Fatal编程技术网

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。