2

我有一种方法可以处理将TextFormField字段的值保存在不同Forms的变量中的逻辑,但是在验证Forms时,它们不会将值保存在我通过参数传递的String变量中。

这是我的变量从以下一种形式的声明:

    final formKeyMotherboard = new GlobalKey<FormState>();
  String _numInvMotherboard,
      _marcaMotherboard,
      _modeloMotherboard,
      _tipoMotherboard,
      _detallesMotherboard,
      _fechaMotherboard;

  final TextEditingController controllerNumInventarioMotherboard =
      new TextEditingController();
  final TextEditingController controllerMarcaMotherboard =
      new TextEditingController();
  final TextEditingController controllerModeloMotherboard =
      new TextEditingController();
  final TextEditingController controllerTipoMotherboard =
      new TextEditingController();
  final TextEditingController controllerDetallesMotherboard =
      new TextEditingController();
  final TextEditingController controllerFechaMotherboard =
      new TextEditingController();

这是方法:

    Step _defaulFrom(
      {@required IconData icon,
      @required String nameForm,
      @required Key keyForm,
      @required String saveNumInv,
      @required String saveMarca,
      @required String saveModelo,
      @required String saveTipo,
      @required String saveDetalles,
      @required String saveFecha,
      @required TextEditingController controllerNumInv,
      @required TextEditingController controllerMarca,
      @required TextEditingController controllerModelo,
      @required TextEditingController controllerTipo,
      @required TextEditingController controllerDetalle,
      @required TextEditingController controllerFecha,
      TextEditingController controllerEncargado,
      String saveEncargado}) {
    return Step(
        title: Text(
          nameForm,
          style: TextStyle(
            color: Colors.black45,
            fontSize: 22.0,
            fontWeight: FontWeight.bold,
          ),
        ),
        content: Form(
            key: keyForm,
            child: Padding(
              padding: const EdgeInsets.all(12.0),
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(top: 8.0),
                    child: TextFormField(
                      controller: controllerNumInv,
                      autocorrect: false,
                      decoration: _defaulImputDecoration(NUM_INVENTARIO, icon),
                      validator: (val) =>
                          val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                      `enter code here`onSaved: (value) => saveNumInv = value,

                      keyboardType: TextInputType.numberWithOptions(),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 8.0),
                    child: TextFormField(
                      controller: controllerMarca,
                      autocorrect: false,
                      decoration: _defaulImputDecoration(MARCA, icon),
                      validator: (val) =>
                          val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                      onSaved: (value) => saveMarca = value,

                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 8.0),
                    child: TextFormField(
                      controller: controllerModelo,
                      autocorrect: false,
                      decoration: _defaulImputDecoration(MODELO, icon),
                      validator: (val) =>
                          val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                      onSaved: (value) => saveModelo = value,

                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 8.0),
                    child: TextFormField(
                      controller: controllerTipo,
                      autocorrect: false,
                      decoration: _defaulImputDecoration(TIPO, icon),
                      validator: (val) =>
                          val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                      onSaved: (value) => saveTipo = value,

                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 8.0),
                    child: TextFormField(
                      controller: controllerDetalle,
                      autocorrect: false,
                      decoration: _defaulImputDecoration(DETALLES, icon),
                      validator: (val) =>
                          val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                      onSaved: (value) => saveDetalles = value,

                    ),
                  ),
                  controllerEncargado != null
                      ? Padding(
                          padding: const EdgeInsets.only(top: 8.0),
                          child: TextFormField(
                            controller: controllerEncargado,
                            autocorrect: false,
                            decoration: _defaulImputDecoration(
                                NOMBRE_ENCARGADO, Icons.person),
                            validator: (val) =>
                                val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                            onSaved: (value) => saveEncargado = value,

                          ),
                        )
                      : Divider(
                          color: Colors.transparent,
                        ),
                  Padding(
                    padding: const EdgeInsets.only(top: 8.0),
                    child: TextFormField(
                      autocorrect: false,
                      controller: controllerFecha,
                      decoration: InputDecoration(
                        suffixIcon: IconButton(
                            icon: Icon(Icons.date_range),
                            onPressed: () {
                              _selectDate(context);
                              setState(() {
                                //_saveDate = new DateFormat.yMd(_dateTime)
                              });
                            }),
                        contentPadding: EdgeInsets.all(16.0),
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(25.0),
                        ),
                        labelText: 'Fecha',
                        labelStyle: TextStyle(
                            color: Colors.black54,
                            fontSize: 16.0,
                            decorationStyle: TextDecorationStyle.wavy),
                      ),
                      validator: (val) =>
                          val.isEmpty ? ERROR_RELLENE_CAMPO : null,
                      onSaved: (value) => saveFecha = value,

                    ),
                  ),

               }

                  })
                ],
              ),
            )));
  }

使用这种方法我想减少代码,我有 5 个具有相同代码的表单,唯一改变的是从TextEditingControllercontroller.text获得的TextFormField的值被保存和保存的值,它告诉我它的值为

4

1 回答 1

5

Dart 没有“参考参数”或“输入输出”参数。参数作为值传递,因此函数无法更改该值来自的变量。

如果您需要更改某些内容,您可以创建一个包含要修改的状态的可变对象,并将其传递给函数,或者您可以确保函数可以直接看到变量(如果函数从多个位置)。

于 2018-12-18T10:01:16.927 回答