Flutter 函数参数按引用传递

Val*_*ali 9 dart flutter

我对 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),
    ];
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个名为buildInput的函数,它将采用 2 个参数,一个是我表单中的标签,第二个是我想要修改的实际变量。现在这是棘手的部分,出于某种原因,我不知道为什么......但我的变量永远不会设置为正确的值,并且它始终为null

知道如何通过函数传递参数以便在函数体中进行修改,并在函数调用完成后保持治疗参数吗?

Sid*_*kar 5

既然你在同一个类中使用_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,
    );
  }
Run Code Online (Sandbox Code Playgroud)

此外,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;
      }
    );
  }
Run Code Online (Sandbox Code Playgroud)

你可以这样调用函数:

  List<Widget> buildInputs() {
    return [
      buildInput("Email", "email"),
      buildInput("Password", "password"),
    ];
  }
Run Code Online (Sandbox Code Playgroud)

这只是检查数据是电子邮件还是密码的一种方法。您也可以bool使用变量或使用enum.