Flutter/Dart:调用类静态Widget函数如何不传全参数?
问题
我是Flutter/Dart新手,想要调用FormFields类中的textFormFieldWidget静态函数。该函数包含9个位置参数,但我仅想传递controller、hintText、helpText这3个参数。尝试用命名参数调用时,出现报错“The named parameter 'controller' isn't defined”;传递3个位置参数时,又提示“9 positional arguments found but only 3 found”。我希望能仅传递部分参数,求简单易懂的解决方案。
代码示例
reusable_components.dart
class FormFields { static textFormFieldWidget( TextEditingController controller, String hintText, String helpText, IconData prefixIcon, IconData suffixIcon, bool isPassword, bool enabled, bool readOnly, Color borderColor) { return TextFormField( controller: controller, readOnly: readOnly == null ? false : true, obscureText: isPassword == null ? false : true, decoration: InputDecoration( focusedBorder: const OutlineInputBorder( borderSide: BorderSide( color: Colors.greenAccent, width: 1.0, ), ), enabledBorder: const OutlineInputBorder( borderSide: BorderSide( color: Colors.greenAccent, width: 1.0, ), ), border: OutlineInputBorder( borderSide: BorderSide( color: null == borderColor ? Colors.teal : borderColor, width: 1.0, ), ), hintText: null == hintText ? '' : hintText, helperText: null == helpText ? '' : helpText, prefixIcon: null == prefixIcon ? null : Icon(prefixIcon), suffix: null == suffixIcon ? null : Icon(suffixIcon), enabled: null == enabled ? true : false, )); } }
login_page.dart(StatefulWidget)
final TextEditingController _userEmail = TextEditingController(); FormFields.textFormFieldWidget(controller: _userEmail, hintText: "Hello", helpText: "Help me");
解决方案
步骤1:修改函数参数定义
原函数用的是位置参数,必须按顺序传全所有参数,也不能用命名方式调用。要实现仅传部分参数,需要改成可选命名参数,并给每个参数设置默认值:
class FormFields { static TextFormField textFormFieldWidget({ required TextEditingController controller, // 必填参数,加required标记 String hintText = '', String helpText = '', IconData? prefixIcon, // 允许为空的参数加? IconData? suffixIcon, bool isPassword = false, bool enabled = true, bool readOnly = false, Color borderColor = Colors.teal, }) { return TextFormField( controller: controller, readOnly: readOnly, obscureText: isPassword, enabled: enabled, decoration: InputDecoration( focusedBorder: const OutlineInputBorder( borderSide: BorderSide( color: Colors.greenAccent, width: 1.0, ), ), enabledBorder: const OutlineInputBorder( borderSide: BorderSide( color: Colors.greenAccent, width: 1.0, ), ), border: OutlineInputBorder( borderSide: BorderSide( color: borderColor, width: 1.0, ), ), hintText: hintText, helperText: helpText, prefixIcon: prefixIcon != null ? Icon(prefixIcon) : null, suffix: suffixIcon != null ? Icon(suffixIcon) : null, ), ); } }
关键修改说明:
- 用
{}包裹参数,转为命名参数 - 给必填的
controller加required,确保调用时必须传递 - 给其他参数设置合理默认值,不需要传时自动使用默认值
- 移除冗余的
null == xxx ? 默认值 : xxx判断,代码更简洁
步骤2:调用修改后的函数
现在可以直接用命名参数传递需要的3个参数,其他参数自动使用默认值:
final TextEditingController _userEmail = TextEditingController(); FormFields.textFormFieldWidget( controller: _userEmail, hintText: "Hello", helpText: "Help me", );
如果后续需要传递其他参数(比如密码输入框),直接追加对应命名参数即可:
FormFields.textFormFieldWidget( controller: _userPassword, hintText: "密码", helpText: "请输入6位以上密码", isPassword: true, suffixIcon: Icons.visibility_off, );
内容的提问来源于stack exchange,提问作者jpg.hue
相关产品推荐
相关产品推荐

