AlertDialog 中的 TextFormField 未验证

Posted

技术标签:

【中文标题】AlertDialog 中的 TextFormField 未验证【英文标题】:TextFormField in AlertDialog not validating 【发布时间】:2020-09-14 12:07:12 【问题描述】:

所以我遇到了一个问题,我的 TextFormField 中的验证器没有验证文本字段中的值...

下面是我的整个警报对话框的代码:

showDialog(
            barrierDismissible: false,
            context: context,
            builder: (context) 
              return WillPopScope(
                  onWillPop: () async => false,
                  child: AlertDialog(
                    title: Text('Full name :'),
                    content: Form(
                      key: _nameFormKey,
                      child: TextFormField(
                        controller: displayNameController,
                        validator: (value) 
                          if (!(value.length > 5) && value.isNotEmpty) 
                            return 'Please set your full name';
                          
                          return null;
                        ,
                      ),
                    ),
                    actions: <Widget>[
                      new FlatButton(
                        child: Text('CONFIRM'),
                        onPressed: () 
                          if (_nameFormKey.currentState.validate()) 
                            // prefs.setString(
                            //     'displayName', displayNameController.text);
                            // Navigator.of(context).pop();
                            // displayNameController.clear();
                            print('validated');
                          
                        ,
                      )
                    ],
                  ));
            )

即使在文本字段中没有输入任何值,当我单击按钮时,它也会在调试控制台中打印“已验证”

【问题讨论】:

为什么你添加了'!'在验证器中?? errr.. 我真的不知道如何为全名编写正确的验证逻辑,对我来说这似乎是正确的逻辑.. 还是你建议另一种逻辑? 【参考方案1】:

对于全名验证,我会这样做:

在你的 TextFormField 中,验证器尝试做这样的事情

validator: (value) 
  if (value.isEmpty) 

    // name is empty, don't validate
    return S.of(context).key('errorEmptyField');

   else if (value.split(' ').length < 2) 

    // name contains only 1 word, don't validate
    return S.of(context).key('errorOnlyFirstName');

   else if (value.length < 5) 

    // name is too short, don't validate
    return S.of(context).key('errorNameTooShort');

  
  // validate
  return null;
,

我返回错误字符串显示给用户,但你可以返回布尔值或任何你想要的,无论如何这是一个基本的全名验证逻辑。

【讨论】:

@ETCasual 很好,谢谢,我已经编辑了答案,因为排序检查错误,现在更好了 :)

以上是关于AlertDialog 中的 TextFormField 未验证的主要内容,如果未能解决你的问题,请参考以下文章

如何与 Espresso 中的 alertdialog 交互?

如何对 AlertDialog Kotlin 中的项目使用 OnClickListener?

如何从 Flutter 中的方法获取 AlertDialog 回调?

片段android中的alertdialog显示问题

蜂窝中的蓝色和白色 AlertDialog

Flutter 中的 AlertDialog 小部件无法使用 setState 功能