【问题标题】:Is there a simple way to crossvalidate Flutter Form TextFormFields?有没有一种简单的方法来交叉验证 Flutter Form TextFormFields?
【发布时间】:2019-07-18 13:25:00
【问题描述】:

我有 3 个TextFormFields 用于在 Flutter Form 上输入电话号码(白天、晚上和移动)。

验证每个TextFormField(在validator: 中)允许输入一个空白字符串。

但我不希望保存表单,除非至少输入一个电话号码。

formKey.currentState.validate 显然会验证所有单个字段是否有效。

那么框架中是否有一种简单的方法来交叉验证所有 TextFormFields 并显示错误,而无需为每个 TextFormField 编写单独的验证器并包含对特定字段名的引用(其中我认为这是一个肮脏的黑客)例如

String _validatePhoneNumber(String value) {

    // dirty bit - means I have to write a separate validator for each TextFormField rather than use a generic validator 
    if (value.isEmpty && this.eveningNumber.isEmpty && this.mobileNumber.isEmpty)
        return 'At least one number must be included';

    if (value.isEmpty) return null;

    if (_invalidNumber(value))
        return 'Enter a valid phone number';

    return null;

}

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    您应该为每个TextFormField 添加一个TextEditingController,这样您可以在提交表单时检查每个字段的值。

    例如:

    class MyForm extends StatefulWidget {
    @override
      _MyFormState createState() => _MyFormState();
    }
    
    class _MyFormState extends State<MyForm> {
    
    final _formKey = GlobalKey<FormState>();
    TextEditingController first = TextEditingController();
    TextEditingController second = TextEditingController();
    
    @override
    Widget build(BuildContext context) {
        return Scaffold(
         body: Center(
           child: Form(
              key: _formKey,
              child: ListView(
                 children: <Widget> [
                   TextFormField(
                     controller: firstController
                     // rest of your stuff
                   )
                   // rest of your text fields using subsequent controllers
                   // secondController, thirdControler... 
                 ]
               )
             )
           )
       }
    }
    

    然后,当您想检查它的价值时,您只需致电 firstController.text 或更好,如果您想知道它是否为空,您只需致电 firstController.text.isEmpty

    【讨论】:

    • 谢谢。就像您知道的那样,我非常感谢您不厌其烦地提交答案:-)
    猜你喜欢
    • 2021-06-25
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多