Передать переменные по параметрам, которые будут изменены в функции

У меня есть метод, который заботится о логике сохранения значений полей TextFormField в переменных различных форм, но они не сохраняют значение в переменных 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 форм с одинаковым кодом, единственное, что меняется, это значения, в которых сохраняются и сохраняются значения TextFormField, полученные из TextEditingController с controller.text, и это говорит мне, что его значения равны нулю

2 ответа

Решение

У дротика нет "опорных параметров" или "входных" параметров. Аргументы передаются как значения, поэтому функция не может изменить переменную, из которой получено это значение.

Если вам нужно что-то изменить, вы можете либо создать изменяемый объект, содержащий изменяемое состояние, и передать его функции, либо убедиться, что функция может видеть переменные напрямую (что обычно невозможно, если функция используется из несколько мест).

в дополнение к вышеизложенному, если вы используете уведомитель об изменениях и управление стековым состоянием во Flutter, вы можете поместить значение, которое будет изменено, в baseModel, поскольку другая модель представления расширяет baseModel, и каждая страница имеет доступ к baseModel через свои разные viewmodels, вы можете изменить значение из любого места, и функция, которую вы хотите использовать для его изменения, также увидит его.

Другие вопросы по тегам