Flutter&Textfield:如何通过自动删除空格来限制用户使用textfield中的空格?

问题描述

如何通过在用户输入完毕后自动删除该空格来限制用户在文本字段中使用空格?

例如,如果用户键入King of Light,则他/她离开文本字段后将以KingofLight的身份应用。

TextFormField(
                          initialValue: nickname != null
                              ? nickname
                              : current_user.nickname,decoration: Inputdecoration(
                            border: new OutlineInputBorder(
                              borderSide: new BorderSide(color: Colors.grey),borderRadius: BorderRadius.circular(6),),focusedBorder: OutlineInputBorder(
                              borderSide:
                                  BorderSide(color: Colors.grey,width: 1.0),enabledBorder: OutlineInputBorder(
                              borderSide:
                                  BorderSide(color: Colors.grey,hintText: 'Empty',hintStyle: TextStyle(
                              color: Colors.grey[400],fontSize: 20,//fontWeight: FontWeight.bold,style: TextStyle(
                            fontSize: 20,// fontWeight: FontWeight.bold,validator: (val) => val.length < 2
                              ? 'Enter a nickname 2+char long'
                              : null,onChanged: (val) {
                            val = val.replaceAll(' ','');
                            setState(() => nickname = val);
                          },

请帮助我!谢谢!

解决方法

执行此操作的一种方法是使用TextEditingController并可以根据您的用例调用formatNickname()

class _MyWidgetState extends State<MyWidget>{
  
  FocusNode node = new FocusNode();
  TextEditingController tc = TextEditingController();
  
  @override
  void initState(){
    node.addListener((){
      if(!node.hasFocus){
        formatNickname();
      }
    });
    super.initState();
  }
  
  void formatNickname(){
    tc.text = tc.text.replaceAll(" ","");
  }
  
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextFormField(
          focusNode: node,controller: tc,),TextFormField(),RaisedButton(
          child: Text('Format'),onPressed: (){
            formatNickname();
          },],);
  }
}
,

不允许空格的文本字段,使用正则表达式。如下图-

            TextFormField(
               inputFormatters: [
                if (denySpaces)
                  FilteringTextInputFormatter.deny(
                      RegExp(r'\s')),])

以上解决方案对我有用,可以阻止键盘空间。