我对Dart和Flutter提出疑问。因此,我试图重构一些代码,但陷入了引用问题。
class _LoginPageState extends State<LoginPage> {
String _email;
String _password;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("Login Page"),
),
body: new Container(
padding: new EdgeInsets.all(16),
child: new Form(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: buildInputs()
)),
));
}
Widget buildInput(String label, String val) {
return new TextFormField(
decoration: new InputDecoration(
labelText: label,
),
validator: (value) => value.isEmpty ? "$label can't be empty" : null,
onSaved: (value) => val = value,
);
}
List<Widget> buildInputs() {
return [
buildInput("Email", this._email),
buildInput("Password", this._password),
];
}
}
我正在尝试创建一个名为 buildInput 的函数,该函数将带有2个参数,一个是我表单中的标签,第二个是我要修改的实际变量。现在这是棘手的部分,由于某种原因,我不知道为什么...但是我的变量永远不会设置正确的值,并且始终为 null 。
有什么主意,如何在函数主体中传递带有参数的参数以便在函数主体中进行修改,并在执行完函数调用后使该参数保持含药状态?
答案 0 :(得分:1)
由于您在同一类中使用_email
和_password
变量,为什么还要使用额外的参数?您可以执行以下操作:
Widget buildInput(String label) {
return new TextFormField(
decoration: new InputDecoration(
labelText: label,
),
validator: (value) => value.isEmpty ? "$label can't be empty" : null,
onSaved: (value) => this._email = value,
);
}
此外,dart语言不支持通过引用传递基元,因此它们将始终按值传递。
如果根本需要通过引用传递,则需要将_email
和_password
变量包装在单独的模型类中,然后将该类的对象传递给buildInputs()
函数。 / p>
有关在Dart中通过引用传递的更多详细信息,请参考this question。希望这会有所帮助!
更新:
如果您只需要为TextField
使用一个功能,那么可以采取解决方法。您可以执行以下操作:
Widget buildInput(String label, String val) {
return new TextFormField(
decoration: new InputDecoration(
labelText: label,
),
validator: (value) => value.isEmpty ? "$label can't be empty" : null,
onSaved: (value) {
if(val == "email")
this._email = value;
else if(val == "password")
this._password = value;
}
);
}
您可以这样调用函数:
List<Widget> buildInputs() {
return [
buildInput("Email", "email"),
buildInput("Password", "password"),
];
}
这只是检查数据是电子邮件还是密码的一种方法。您也可以使用bool
变量或使用enum
来实现相同的目的。