【发布时间】:2022-09-27 15:20:42
【问题描述】:
我正在尝试创建一个可重用的小部件。但是,如果我可以设置所有参数,我不想强制所有参数。我只想使用 4 或 5 个参数。其他的将是可选的。 我做了一些研究并尝试在可选参数上添加 [],但我收到了错误消息。
错误:参数 \'parametersValidate\' 的值不能为 \'null\',因为它的类型,但隐含的默认值是 \'null\'。
如果您能帮我解决这个问题,我们将不胜感激。
class TextFormFieldWidget extends StatefulWidget {
String hintText;
Widget prefixIcon;
String defaultText;
TextInputType textInputType;
FocusNode focusNode;
bool obscureText;
TextEditingController controller;
Function functionValidate;
String parametersValidate;
TextInputAction actionKeyboard;
Function onSubmitField;
Function onFieldTap;
TextFormFieldWidget(
this.hintText,
this.textInputType,
this.controller,
[this.parametersValidate],
this.onSubmitField,
this.onFieldTap,
this.defaultText,
{Key? key,
required this.actionKeyboard,
required this.prefixIcon,
required this.focusNode,
required this.obscureText,
required this.functionValidate,
}
) : super(key: key);
@override
_TextFormFieldWidgetState createState() => _TextFormFieldWidgetState();
}
class _TextFormFieldWidgetState extends State<TextFormFieldWidget> {
double bottomPaddingToError = 12;
@override
Widget build(BuildContext context) {
return Theme(
data: Theme.of(context).copyWith(
primaryColor: Colors.black,
),
child: TextFormField(
cursorColor: Colors.black,
// obscureText: widget.obscureText,
keyboardType: widget.textInputType,
textInputAction: widget.actionKeyboard,
// focusNode: widget.focusNode,
style: const TextStyle(
color: Colors.black,
fontSize: 16.0,
fontWeight: FontWeight.w200,
fontStyle: FontStyle.normal,
letterSpacing: 1.2,
),
initialValue: widget.defaultText,
decoration: InputDecoration(
prefixIcon: widget.prefixIcon,
hintText: widget.hintText,
enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
hintStyle: const TextStyle(
color: Colors.grey,
fontSize: 14.0,
fontWeight: FontWeight.w300,
fontStyle: FontStyle.normal,
letterSpacing: 1.2,
),
contentPadding: EdgeInsets.only(
top: 12, bottom: bottomPaddingToError, left: 8.0, right: 8.0),
isDense: true,
errorStyle: const TextStyle(
color: Colors.red,
fontSize: 12.0,
fontWeight: FontWeight.w300,
fontStyle: FontStyle.normal,
letterSpacing: 1.2,
),
errorBorder: const OutlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
focusedErrorBorder: const OutlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
),
controller: widget.controller,
validator: (value) {
if (widget.functionValidate != null) {
String resultValidate =
widget.functionValidate(value, widget.parametersValidate);
if (resultValidate != null) {
return resultValidate;
}
}
return null;
},
onFieldSubmitted: (value) {
if (widget.onSubmitField != null) widget.onSubmitField();
},
onTap: () {
if (widget.onFieldTap != null) widget.onFieldTap();
},
),
);
}
}
String? commonValidation(String value, String messageError) {
var required = requiredValidator(value, messageError);
if (required != null) {
return required;
}
return null;
}
String? requiredValidator(value, messageError) {
if (value.isEmpty) {
return messageError;
}
return null;
}
void changeFocus(
BuildContext context, FocusNode currentFocus, FocusNode nextFocus) {
currentFocus.unfocus();
FocusScope.of(context).requestFocus(nextFocus);
}
-
你能显示你在这个小部件中传入的
functionValidate吗? -
我没有传递函数。我希望这是可选的
-
你是说
functionValidate(不是parametersValidate)应该是可选的吗? -
是的。还有actionKeyboard、prefixIcon、focusNode、obscureText、onFieldTap、defaultText、textInputType、parametersValidate
-
好的。谢谢您的帮助
标签: flutter widget textformfield