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