用户交互后自动验证 TextFormField

Posted

技术标签:

【中文标题】用户交互后自动验证 TextFormField【英文标题】:Autovalidate of TextFormField after user interaction 【发布时间】:2021-10-13 13:19:20 【问题描述】:

我正在开发一个颤振电子商务应用程序,并且在注册时,用户名应该是唯一的,为此,我们在 API 中有一个端点来检查用户名是否被使用,我的问题是验证,我需要验证用户交互后,在颤振中我们有自动验证模式,但只有(always, onUserInteraction)选项,我需要在用户交互后立即验证

用户名输入的textFormField是

TextFormField(
                cursorColor: Theme.of(context).primaryColor,
                autovalidateMode: AutovalidateMode.onUserInteraction,
                decoration: InputDecoration(
                  suffixIcon: SuffixIcon(),
                  labelText:
                      'Choose suitable name and relevant to your products',
                  hintText: 'SweetCandies',
                  labelStyle: TextStyle(color: Colors.black),
                  focusedBorder: UnderlineInputBorder(
                    borderSide: BorderSide(
                      color: Theme.of(context).primaryColor,
                    ),
                  ),
                ),
                validator: (value) 
                  if(value!.isNotEmpty)
                  Provider.of<Store>(context).usernameExistence(value, 'no');
                  if(Provider.of<Store>(context).nameExistence)
                    return 'The Chosen name is already taken';
                  
                  if (value.isEmpty) 
                    return 'Required';
                  
                ,
                onSaved: (value) 
                  Provider.of<Store>(context, listen: false)
                      .storeInformation['name'] = value!;
                ,
              )

有什么方法可以在用户交互后激活验证器???

【问题讨论】:

您能解释一下“用户交互后”是什么意思吗? 我的意思是在用户将值插入到 textFormField 之后。 【参考方案1】:

您可以将focusNode 附加到TextField,这样每当焦点发生变化时,您就可以进行 api 调用并验证文本

将此代码和initState 添加到您的代码中

TextEditingController controller = TextEditingController();
FocusNode focusNode;
bool _hasInputError;
String errorText = "";
String text;
  @override
  void initState() 
    super.initState();
    focusNode = new FocusNode();
    focusNode.addListener(() 
      if (!focusNode.hasFocus) 
        setState(() 
         if(Provider.of<Store>(context).nameExistence)// your condition
            _hasInputErro = true;
            errorText = 'The Chosen name is already taken';
         // <-- else if condition ...
         else
           _hasInputErro = false;
         
        );
      
    );
  

在 TextFormField 中:

TextFormField(
    focusNode: focusNode,// <-- add focusNode here
    controller: controller,// <-- add controller here
    cursorColor: Theme.of(context).primaryColor,
    autovalidateMode: AutovalidateMode.onUserInteraction,
    decoration: InputDecoration(
    errorText: _hasInputError ? errorText : null, // <-- add this line to show errors
      suffixIcon: SuffixIcon(),
      labelText:
          'Choose suitable name and relevant to your products',
      hintText: 'SweetCandies',
      labelStyle: TextStyle(color: Colors.black),
      focusedBorder: UnderlineInputBorder(
        borderSide: BorderSide(
          color: Theme.of(context).primaryColor,
        ),
      ),
    ),
   // validator: ... , // <-- comment validator
    onSaved: (value) 
      Provider.of<Store>(context, listen: false)
          .storeInformation['name'] = value!;
    ,
)

【讨论】:

以上是关于用户交互后自动验证 TextFormField的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 2 - 设置自动完成 TextFormField 的初始值

用户在颤动中输入1个字符后如何自动聚焦下一个文本字段

在 Web 上,如何控制自动显示在焦点 TextFormField 上的可见性图标,该 TextFormField 的 obscureText 属性设置为 true?

Flutter TextFormField 控件

TextFormField 在验证时不显示错误

在 Flutter 中仅允许 TextFormField 中的特定输入而无需验证