Flutter 颤振:创建可重用的小部件

Flutter 颤振:创建可重用的小部件,flutter,dart,widget,Flutter,Dart,Widget,我的应用程序是基于表单的,它涉及很多文本字段。所有字段都共享相同的样式,表单页面变得越来越长,所以我决定创建一个小部件,并在需要时调用它 我用以下代码创建了一个文件show\u text\u field.dart: showTextField(String label, var variable){ return TextFormField( keyboardType: TextInputType.text, onSaved: (val) => variable = val,

我的应用程序是基于表单的,它涉及很多文本字段。所有字段都共享相同的样式,表单页面变得越来越长,所以我决定创建一个
小部件
,并在需要时调用它

我用以下代码创建了一个文件
show\u text\u field.dart

showTextField(String label, var variable){
return TextFormField(
  keyboardType: TextInputType.text,
  onSaved: (val) => variable = val,
  decoration: InputDecoration(
      labelText: label,
      contentPadding: EdgeInsets.fromLTRB(15.0, 15.0, 15.0, 15.0),
      border: OutlineInputBorder(
        borderRadius: BorderRadius.circular(5.0),

      )),
  validator: (value) {
    if (value.isEmpty) {
      return '$label cannot be empty';
    } else {
      return null;
    }
  },
);
}
它工作正常,但我无法从字段中检索值

问题:

  • 如何从保存的
    事件中获取值
  • 这是正确的方法吗
  • 创建可重用的
    输入装饰
    小部件比重用整个小部件更好吗
  • 如果这是正确的方法,那么是否有任何方法可以扩展/修改字段验证器

  • 在这种情况下,你错过了一件非常重要的事情。如果要检索组件外部的值,必须通过showTextField函数param传递该值。我会这样做:

    showTextField(String label, var variable, Function onSaved)
    
    您的最终代码可以如下所示:

    showTextField(String label, var variable, Function onSaved){
    return TextFormField(
      keyboardType: TextInputType.text,
      onSaved: onSaved,
      decoration: InputDecoration(
          labelText: label,
          contentPadding: EdgeInsets.fromLTRB(15.0, 15.0, 15.0, 15.0),
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(5.0),
    
          )),
      validator: (value) {
        if (value.isEmpty) {
          return '$label cannot be empty';
        } else {
          return null;
        }
      },
    );
    }
    
    正因为如此,您将能够在执行事件
    onSaved
    时实现所需的逻辑

    公元2年。一切取决于你的需要。如果您需要在提交时处理该值,那么这是一个很好的方法

    公元3年。这里也要看情况。我会用你的方式来做,但这里也取决于它必须解决的问题的背景


    公元4年。您所说的扩展/修改归档验证是什么意思?您有
    验证器
    ,在那里您可以做任何您想要/需要的事情。您还可以传递函数对表单中的所有字段进行自定义验证(我假设您可能希望以不同的方式验证不同的字段)

    在这种情况下,您会错过一件非常重要的事情。如果要检索组件外部的值,必须通过showTextField函数param传递该值。我会这样做:

    showTextField(String label, var variable, Function onSaved)
    
    您的最终代码可以如下所示:

    showTextField(String label, var variable, Function onSaved){
    return TextFormField(
      keyboardType: TextInputType.text,
      onSaved: onSaved,
      decoration: InputDecoration(
          labelText: label,
          contentPadding: EdgeInsets.fromLTRB(15.0, 15.0, 15.0, 15.0),
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(5.0),
    
          )),
      validator: (value) {
        if (value.isEmpty) {
          return '$label cannot be empty';
        } else {
          return null;
        }
      },
    );
    }
    
    正因为如此,您将能够在执行事件
    onSaved
    时实现所需的逻辑

    公元2年。一切取决于你的需要。如果您需要在提交时处理该值,那么这是一个很好的方法

    公元3年。这里也要看情况。我会用你的方式来做,但这里也取决于它必须解决的问题的背景


    公元4年。您所说的扩展/修改归档验证是什么意思?您有
    验证器
    ,在那里您可以做任何您想要/需要的事情。您还可以传递函数,对表单中的所有字段进行自定义验证(我假设您可能希望以不同的方式验证不同的字段)

    谢谢您的回答,我如何传递
    onSaved
    函数?是的,你们是对的,我想以不同的方式验证字段,所以在这种情况下,我必须修改验证器。你能提供一个例子吗?你可以在执行showTextField的时候传递它,就像这样:showTextField(“label”,variable,(value){你把代码放在这里})我这样叫它
    showTextField('label',var,(val)=>\u test=val),
    但是它不起作用。试着这样做:`showTextField('label',var,(val){\u test val;})`如果这不起作用,我将使用
    onChanged
    方法,而不是
    onSaved
    。每次在输入字段中键入内容时,都会调用此函数。因为可能存在这样一种情况,即您没有提交值,并且onSaved没有被调用感谢您的回答,我如何传递
    onSaved
    函数?是的,你们是对的,我想以不同的方式验证字段,所以在这种情况下,我必须修改验证器。你能提供一个例子吗?你可以在执行showTextField的时候传递它,就像这样:showTextField(“label”,variable,(value){你把代码放在这里})我这样叫它
    showTextField('label',var,(val)=>\u test=val),
    但是它不起作用。试着这样做:`showTextField('label',var,(val){\u test val;})`如果这不起作用,我将使用
    onChanged
    方法,而不是
    onSaved
    。每次在输入字段中键入内容时,都会调用此函数。因为可能存在这样一种情况,即您不提交值,并且不会调用onSaved