【问题标题】:Flutter function parameter pass by referenceFlutter 函数参数通过引用传递
【发布时间】:2019-03-14 09:10:57
【问题描述】:

我对 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

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

【问题讨论】:

    标签: dart flutter


    【解决方案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() 函数。

    您可以参考this question 了解有关在 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 来实现相同的目的。

    【讨论】:

    • 但这正是我不想做的,这与我想做的恰恰相反。我的想法是有一个函数,而不是使用两个重复的代码片段,它们做完全相同的事情,唯一的差异是实际变量。
    • 对于您需要的东西,可能有一个小的解决方法。您可以使用val 参数来检查文本是电子邮件还是密码。我会用另一个例子来更新我的答案。
    • 您不能通过引用传递变量。您的代码中需要对_email_password 进行单独的分配,因为每个分配只能分配给其中一个。然后,您可以摆弄如何选择要使用的分配,但在某处需要有两个单独的分配。也可以使用传递单个函数(String value) { this._email = value; }(String value) { this._password = value; }作为参数,然后在onSave中调用传递函数(或直接作为onSave参数的值)。
    • this 关键字未定义。所以,我使用了class_name().variable_name。这是最佳做法吗?
    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 2010-10-07
    • 2016-10-26
    • 2010-09-13
    • 2011-12-15
    • 2018-06-26
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多