颤振功能参数通过引用传递

时间:2019-03-14 09:10:57

标签: 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),
    ];
  }
}

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

有什么主意,如何在函数主体中传递带有参数的参数以便在函数主体中进行修改,并在执行完函数调用后使该参数保持含药状态?

1 个答案:

答案 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来实现相同的目的。