如何添加检查用户是不是在文本字段中输入了某些内容?

Posted

技术标签:

【中文标题】如何添加检查用户是不是在文本字段中输入了某些内容?【英文标题】:How to add check if user has typed something in a text field?如何添加检查用户是否在文本字段中输入了某些内容? 【发布时间】:2019-11-29 12:59:15 【问题描述】:

我有三个类,根据登录页面的类名分为三个文件; CustomTextField(设置了自定义文本字段样式)、FormCard(基本上是用于登录的表单,其中包括 CustomTextField)和 LogInPage(具有表单卡,以及用于登录和注册的按钮)。

登录页面构建方法调用FormCard(),FormCard构建方法调用CustomTextField()。按下登录按钮时如何检查用户是否将文本字段留空?

我阅读了 GlobalKey 文档,给出的示例是文本字段位于同一文件中的情况。是否可以使用 GlobalKey 来检查类在不同文件中的情况?

【问题讨论】:

【参考方案1】:

自己尝试一下,看看是否有效。 如果您导入所有类,那么它们的行为就像单个文件一样。随着应用程序大小的增长,隔离只是为了维护和管理代码。 所以,IMO 它将同样工作。

【讨论】:

现在可以了!终于有时间尝试了。 是的,试试吧,让大家知道。如果有效,请标记答案【参考方案2】:

我建议尽量避免在您的应用中使用GlobalKey,有关详细信息,请参阅this 问题。

现在要解决您的问题,您可以使用许多状态管理技术来解决此问题,我将举一个最简单的技术示例,虽然不是最好的方法,但会起作用。

首先您在登录屏幕中声明一个TextEditingController,然后您将向下传递这个控制器,直到您将它传递给CustomTextField()TextEditingController 将包含使用它的文本字段中的文本。详情见下方代码sn-p。


class LoginScreen extends StatefulWidget 
  @override
  _LoginScreenState createState() =>_LoginScreenState();


class _LoginScreenState extends State<LoginScreen> 
    TextEditingController controller;

    @override
    void initState() 
        controller = TextEditingController();
        super.initState();
    

    @override
    void dispose() 
        controller.dispose(); //prevents memory leak
    

    @override
    Widget build(BuildContext context) 
        // Here you can check if the TextField is empty or not
        if (controller.text == null || controller.text == "") 
             print("empty");
         else 
             print("not empty");
        
        return FormCard(controller: controller);



class FormCard extends StatelessWidget 
    final TextEditingController controller;
    FormCard(this.controller);

    @override
    Widget build(BuildContext context) 
        return CustomTextField(controller: controller);
    


/* CustomTextField is stateful because sometimes
 stateless widgets do not update textfields text when
 equipped with controllers
*/
class CustomTextField extends StatefulWidget 

   final TextEditingController controller;
   CustomTextField(this.controller);

  @override
  _CustomTextFieldState createState() =>_CustomTextFieldState();


class _CustomTextFieldState extends State<CustomTextField> 
    @override
    Widget build(BuildContext context) 
        return TextField(
            controller: controller,
        );
    

您需要将所有类放在同一个文件中,或者按照 mahi 的说明将它们全部导入。

这种技术在大型应用程序中会让人头疼,在 Flutter 中查找状态管理概念以找到更好的实现方式。

【讨论】:

【参考方案3】:

我知道我对此有点晚了,但我想指出使用 Ali Amin 方法的问题。

看,如果用户不能使用空格来填充文本字段,他的回答将解决手头的整个问题。但是,如果用户只按空格键而不按其他字母,那么您的程序将相信他们确实在文本字段中填充了某些内容,即使从技术上讲他们并没有。

如果您想确保用户在文本字段中实际输入了某些内容,则修剪该字段的左右空格的整个字符串,并检查该新字符串是否为空。

例子:

    TextField(
   controller: MyTextEdittingController
  onChanged: (text) 
    if(MyTextEdittingController.text.trim() == ""
          console.log("I am empty");
      
      else
         console.log("I am filled");
     
  ,
),

【讨论】:

以上是关于如何添加检查用户是不是在文本字段中输入了某些内容?的主要内容,如果未能解决你的问题,请参考以下文章

检查输入到文本字段的值是不是是给定范围内的整数

如何检查 ResultSet 中是不是存在字段?

如何检查CKEditor中是不是有一些文字?

如何实时检查文本字段输入?

如何将标签/插槽添加到输入字段 Vue

键入另一个文本字段时,动态文本字段数据将丢失