当前位置: 首页 > 知识库问答 >
问题:

DropdownButton选择调用Flutter中其他字段的onValidate函数

商风华
2023-03-14

不知道我错过了什么。当选择下拉的值时,窗体onvaidate()被激发,因此我的其他字段显示错误。我怎么才能阻止它?这是密码

Widget build(BuildContext context){//return Scaffold(//AppBar:AppBar(Title:Text(“Registration”)),//Body:Center(Child:Text(Widget.User.DisplayName)),//);

FirebaseUser user = widget.user;

  return Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
    title: Text("Registration"),
  ),
  body: SafeArea(
      top: false,
      bottom: false,
      child: Form(
          key: _formKey,
          autovalidate: true,
          child: ListView(
            padding: const EdgeInsets.symmetric(horizontal: 16.0),
            children: <Widget>[
              TextFormField(
                validator: (value) => value.isEmpty ? 'Name is Required' : null,
                decoration: const InputDecoration(
                  icon: const Icon(Icons.person),
                  hintText: 'Enter your first and last name',
                  labelText: 'Name',
                ),
              ),
              TextFormField(
                decoration: const InputDecoration(
                  icon: const Icon(Icons.phone),
                  hintText: 'Enter a phone number',
                  labelText: 'Phone',
                ),
                initialValue: user.phoneNumber,
                enabled: user.phoneNumber == null,
                keyboardType: TextInputType.phone,
                validator: (value) => value.isEmpty ? 'Phone number is Required' : null

                // inputFormatters: [
                //   WhitelistingTextInputFormatter.digitsOnly, 
                // ],
              ),
              TextFormField(
                decoration: const InputDecoration(
                  icon: const Icon(Icons.email),
                  hintText: 'Enter a email address',
                  labelText: 'Email',
                ),
                initialValue: user.email,
                enabled: user.email == null,
                validator: (value) => value.isEmpty ? 'Email is Required' : null,
                keyboardType: TextInputType.emailAddress,
              ),
              TextFormField(
                decoration: const InputDecoration(
                  icon: const Icon(Icons.remove_red_eye),
                  hintText: 'Enter the Password',
                  labelText: 'Password',
                ),
                keyboardType: TextInputType.text,
                obscureText: true,
                validator: (value) => value.isEmpty ? 'Password is Required' : null
              ),  
              FormField(
                builder: (FormFieldState state) {
                  return InputDecorator(
                    decoration: InputDecoration(
                      icon: const Icon(Icons.card_membership),
                      labelText: 'ID Type',
                    ),
                    isEmpty: _profile.govId == null,
                    child: DropdownButtonHideUnderline(
                      child: DropdownButton(
                        value: _profile.govId,
                        isDense: true,
                        onChanged: (String newValue) {
                          setState(() {
                            _profile.govId = newValue;
                            state.didChange(newValue);
                          });
                        },
                        items: _govtIds.map((String value) {
                          return DropdownMenuItem(
                            value: value,
                            child: Text(value),
                          );
                        }).toList(),
                      ),
                    ),
                  );
                },
              ),
              TextFormField(
                decoration: const InputDecoration(
                  icon: const Icon(Icons.confirmation_number),
                  hintText: 'Enter your Governmenr ID number',
                  labelText: 'ID Number',
                ),
                keyboardType: TextInputType.datetime,
                validator: (value) => value.isEmpty ? 'ID Number is Required' : null
              ),
              FormField(
                builder: (FormFieldState state) {
                  return InputDecorator(
                    decoration: InputDecoration(
                      icon: const Icon(Icons.business),
                      labelText: 'Block Info',
                    ),
                    isEmpty: _profile.block == null,
                    child: 
                    
                    // Column(children: [RadioListTile(title: Text("A")),RadioListTile(title: Text("B"))]),
                    
                    
                    // Radio(
                    //   value: 0,
                    //   groupValue: _blocks,
                    //   onChanged: (value){}),
                    
                    DropdownButtonHideUnderline(
                      child: 
                      DropdownButton(
                        value: _profile.block,
                        isDense: true,
                        onChanged: (String newValue) {
                          setState(() {
                            _profile.block = newValue;
                            state.didChange(newValue);
                          });
                        },
                        items: _blocks.map((String value) {
                          return DropdownMenuItem(
                            value: value,
                            child: Text(value),
                          );
                        }).toList(),
                      ),
                    ),
                  );
                },
              ),
               TextFormField(
                decoration: const InputDecoration(
                  icon: const Icon(Icons.home),
                  hintText: 'Enter your Flat number',
                  labelText: 'Flat number',
                ),
                 inputFormatters: [LengthLimitingTextInputFormatter(3)],
                validator: (value) {
                  if (value.isEmpty) {
                    return 'Flat number is Required';
                  } else if (_profile.isValidHouseNumber() == false) {
                    return 'Invalid flat number';
                  } else {
                    return null;
                  }
                },
                keyboardType: TextInputType.number,
                onChanged:(value) {
                  _profile.houseNo = value;
                },
              ),
                Padding(
                padding: EdgeInsets.fromLTRB(38.0, 30.0, 0.0, 0.0),
                child: SizedBox(
                height: 50.0,
                child: FlatButton(
                  // elevation: 5.0,
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10.0)),
                  color: Colors.green,
                  child: Text('Submit',
                      style: TextStyle(fontSize: 20.0, color: Colors.white)),
                  onPressed: _validateAndSubmit,
                ),
              ))
    ],
  ))),
);

}

共有1个答案

姬阳曜
2023-03-14

调用一个方法在validate函数的所有其他字段中返回null。这将清除验证。这是一个解决办法,但不能解决问题。

上面的代码似乎没有什么问题,你能把其他字段的代码也加进去吗?

编辑:

Form(
  key: _formKey[0],
  child: TextFormField(
    validator: (value) => value.isEmpty ? 'Name is Required' : null,
    decoration: const InputDecoration(
      icon: const Icon(Icons.person),
      hintText: 'Enter your first and last name',
      labelText: 'Name',
    ),
  ),
),

列表 >_formkey=新列表(number_of_keys);

调用相应的setState,如下所示:

_FormKey[position].CurrentState.SetState((){});

 类似资料:
  • 问题内容: 我需要具有2个字段的django modelform,其中第二个字段选择列表取决于在第一个字段中选择的内容。我的模特: 如果vehicle_type设置为 personal, 如何将 make 字段的选择设置为 PERSONAL_MAKES ?我怎样才能做到这一点?在模型级别上可以吗? __ 问题答案: 您可能不能,因为这取决于用户与表单的交互:您的服务器无法预先知道用户将表单发送到浏

  • 假设我有两个html文件具有如下功能: 我想从a.html直接指向B.html,然后直接调用函数B。我怎样才能做到?。因为我想要将JSON字符串从函数A传递到函数B,而不是使用window.onload()或$(document).ready()。 我将我的JSON字符串存储到本地存储,并将用户引导到b.html。然后函数B将读取本地存储并直接处理数据。

  • 我已经用PHP类分离了几个文件,现在我需要将它们放在一个函数中,如下所示: 中的类名为settings,中的类名为users。我有个错误: PHP可捕获的致命错误:传递给ajaxlogin::__construct()的参数1必须是设置的实例,没有给定,在第47行/var/www/html/idcms/admin/class/login-ajax.PHP中调用,在第13行/var/www/html

  • 问题内容: 如何以方便的方式选择表中的所有列和聚合函数? 也就是说,我有一个包含100列的表格,我想发送以下内容 谢谢! 问题答案: 要从表中选择所有列,请执行以下操作: 要从表中选择一个最大值是 两者结合: 如果要在结果行中省略column44并且仅具有maxcol44,则必须列出这些列:

  • 我希望,如果我选择“mammals”,动物选择选项只显示值为1的选项data-animal_class。 我知道如何获得哺乳动物值,但我不知道如何使用过滤器 这是我的代码:

  • 问题内容: 对此不熟悉,尝试按照著名的Flask教程使用Flask-bootstrap,Flask-wtforms,Jinja等构建一个应用程序 我有一个带有2个选择字段和一个按钮的表单。 我只希望第一个字段预先填充,而另一个字段根据前一个字段的选定值填充(在客户端?)。 在模板中,我尝试类似 可以正常工作(只要我返回元组列表以使用正确的javascript和路由填充下一个字段),但我想要以下内容