我对 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。
知道如何通过函数传递参数以便在函数体中进行修改,并在函数调用完成后保持治疗参数吗?
既然你在同一个类中使用_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()函数。
有关在 Dart 中按引用传递的更多详细信息,您可以参考此问题。希望这可以帮助!
更新:
如果您只需要为 使用一个函数,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.
| 归档时间: | 
 | 
| 查看次数: | 20801 次 | 
| 最近记录: |