Flutter:创建可重用的小部件

时间:2019-09-23 10:06:58

标签: flutter dart widget

我的应用程序基于表单,并且涉及很多文本字段。所有字段都共享相同的样式,并且表单页面越来越长,因此我决定创建一个widget并在需要的地方调用它。

我使用以下代码创建了文件show_text_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;
    }
  },
);
}

它正常工作,但是我无法从该字段中检索值。

问题:

  1. 如何从onSaved事件中获取价值?
  2. 这是正确的方法吗?
  3. 创建可重复使用的InputDecoration小部件比重用整个小部件更好吗?
  4. 如果这是正确的方法,那么有什么办法可以扩展/修改字段验证器?

1 个答案:

答案 0 :(得分:0)

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

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时能够实现所需的逻辑。

ad 2.一切取决于您的需求。如果您需要处理提交时的价值,那么这是个好方法。

ad 3.这里也要视情况而定。我会按照您的方式进行操作,但是这还取决于它必须解决的问题的背景

ad 4.您是指extend/modify filed validation是什么意思?您拥有validator,在这里您可以做任何您想要/需要的事情。您还可以传递函数以对表单中的所有字段进行自定义验证(我假设您可能希望以不同的方式验证不同的字段)