【问题标题】:Flutter Form Autovalidate is firing at first timeFlutter Form Autovalidate 首次触发
【发布时间】:2020-08-01 05:52:26
【问题描述】:

我在第一次启动应用程序时遇到错误,所有文本字段都在验证,但一定不是这样,我从 Flutter 文档中获取了表单示例,并添加了 autovalidate:true,在 web 上显然它可以工作但是使用物理设备和模拟器它不起作用,错误和代码如下

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   final appTitle = 'Form Validation Demo';

   return MaterialApp(
    title: appTitle,
    home: Scaffold(
     appBar: AppBar(
       title: Text(appTitle),
     ),
     body: MyCustomForm(),
   ),
  );
 }
}

class MyCustomForm extends StatefulWidget {
  @override
  MyCustomFormState createState() {
    return MyCustomFormState();
  }
}


class MyCustomFormState extends State<MyCustomForm> {

 final _formKey = GlobalKey<FormState>();

 @override
 Widget build(BuildContext context) {

  return Form(
    autovalidate:true,
    key: _formKey,
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        TextFormField(
          validator: (value) {
            if (value.isEmpty) {
              return 'Please enter some text';
            }
            return null;
          },
        ),
        Padding(
          padding: const EdgeInsets.symmetric(vertical: 16.0),
          child: RaisedButton(
            onPressed: () {                
              if (_formKey.currentState.validate()) {  
                Scaffold.of(context)
                  .showSnackBar(SnackBar(content: Text('Processing Data')));
              }
            },
            child: Text('Submit'),
          ),
        ),
      ],
    ),
  );
 }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    要在第一次停止 autovalidate 我们应该使用 autovalidateMode: AutovalidateMode.onUserInteraction, 而不是 autovalidate=true。由于 autovalidate弃用。所以像这样使用:-

    将 GlobalKey 定义为:

    final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
    

    在脚手架上使用这个。

    child: new Form(
                  key: _formKey,
                  autovalidateMode: AutovalidateMode.onUserInteraction,
                  child: FormUI(),
                ),
    

    【讨论】:

      【解决方案2】:

      您必须创建一个 autoValidate bool 变量,该变量默认为 false,因此不会显示验证消息。当用户按下提交按钮时,它将检查验证,如果无效,则将 autoValidate 变量设置为 true 并显示验证错误.一旦用户克服验证问题,它将自动验证,否则它将正常提交表单。

      class MyCustomForm extends StatefulWidget {
        @override
        MyCustomFormState createState() {
          return MyCustomFormState();
        }
      }
      
      
      class MyCustomFormState extends State<MyCustomForm> {
      
        final _formKey = GlobalKey<FormState>();
        bool _autoValidate=false;
        @override
        Widget build(BuildContext context) {
      
          return Form(
            autovalidate:_autoValidate,
            key: _formKey,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                TextFormField(
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter some text';
                    }
                    return null;
                  },
                ),
                Padding(
                  padding: const EdgeInsets.symmetric(vertical: 16.0),
                  child: RaisedButton(
                    onPressed: () {
                      if (_formKey.currentState.validate()) {
                        Scaffold.of(context)
                            .showSnackBar(SnackBar(content: Text('Processing Data')));
                      }else{
                        setState(() {
                          _autoValidate=true;
                        });
                      }
                    },
                    child: Text('Submit'),
                  ),
                ),
              ],
            ),
          );
        }
      }
      

      【讨论】:

      • 如果我使用该解决方案,我没有实时自动验证,我不想要那个,我想要 autovalidate:true,但不是第一次像这里公开的github.com/flutter/flutter/issues/15404
      • 我使用此代码,如果用户第一次错误提交表单,我会获得实时自动验证。您尝试过吗?
      • 是的,但我想从一开始就为每个字段使用自动验证,但我发现这是一个颤振的错误,我会按照你说的做,谢谢
      【解决方案3】:

      如果您想从一开始就对每个字段进行自动验证,您可以考虑这个解决方案,但它很忙,因为您必须为您拥有的每个 TextFormField 创建布尔值。

      import 'package:flutter/material.dart';
      
      class MyCustomForm extends StatefulWidget {
        @override
        MyCustomFormState createState() {
          return MyCustomFormState();
        }
      }
      
      
      class MyCustomFormState extends State<MyCustomForm> {
      
        final _formKey = GlobalKey<FormState>();
        bool _autoValidate=false;
        bool _validateFieldOne=false;
      
        @override
        Widget build(BuildContext context) {
      
          return Form(
            autovalidate:_autoValidate,
            key: _formKey,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                TextFormField(
                  autovalidate: _autoValidate,
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter some text';
                    }
                    return null;
                  },
                  onTap: (){
                    setState(() {
                      _validateFieldOne=true;
                    });
                  },
      
                ),
                Padding(
                  padding: const EdgeInsets.symmetric(vertical: 16.0),
                  child: RaisedButton(
                    onPressed: () {
                      if (_formKey.currentState.validate()) {
                        Scaffold.of(context)
                            .showSnackBar(SnackBar(content: Text('Processing Data')));
                      }else{
                        setState(() {
                          _autoValidate=true;
                        });
                      }
                    },
                    child: Text('Submit'),
                  ),
                ),
              ],
            ),
          );
        }
      }
      

      【讨论】:

      • _validateFieldOne 未在此答案中使用
      【解决方案4】:

      这里_validateFieldOne 是有状态变量,用于检查表单字段的验证状态。这样您就可以为每个表单字段使用变量。

      import 'package:flutter/material.dart';
      
      class MyCustomForm extends StatefulWidget {
        @override
        MyCustomFormState createState() {
          return MyCustomFormState();
        }
      }
      
      
      class MyCustomFormState extends State<MyCustomForm> {
      
        final _formKey = GlobalKey<FormState>();
        bool _validateFieldOne = false;
      
        @override
        Widget build(BuildContext context) {
      
          return Form(
            key: _formKey,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                TextFormField(
                  autovalidate: _validateFieldOne,
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter some text';
                    }
                    return null;
                  },
                  onTap: (){
                    setState(() {
                      _validateFieldOne = true;
                    });
                  },
      
                ),
                Padding(
                  padding: const EdgeInsets.symmetric(vertical: 16.0),
                  child: RaisedButton(
                    onPressed: () {
                      if (_formKey.currentState.validate()) {
                        Scaffold.of(context)
                            .showSnackBar(SnackBar(content: Text('Processing Data')));
                      }
                    },
                    child: Text('Submit'),
                  ),
                ),
              ],
            ),
          );
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 2022-01-01
        • 2022-10-01
        • 2020-11-21
        • 1970-01-01
        • 2020-04-28
        • 2016-12-18
        相关资源
        最近更新 更多