Сброс TextfieldController для всех текстовых полей с использованием провайдера - PullRequest
0 голосов
/ 02 августа 2020

У меня проблема, пытаясь понять, как это сделать. В основном в моем приложении я хочу сбросить все поля для «очистки» пользователем. Я могу сбросить все, кроме TextFields. Единственный способ решить эту проблему, который я нашел, - использовать if, который вы видите внутри Consumer. Я не думаю, что это правильный способ справиться с подобными вещами. слишком тяжелый. Я пытаюсь найти самое чистое и легкое решение, даже чтобы узнать, что лучше всего подходит в таких ситуациях.

Заранее спасибо!

return Provider.of<Provider_Class>(context, listen: false).fields[_label] != null ? SizedBox(
      height: 57.5,
      child: Consumer<Provider_Class>(builder: (context, provider, child) {
        if (provider.resetted == true) {
          _controller.text = "";
        }
        return Material(
          elevation: this.elev,
          shadowColor: Colors.black,
          borderRadius: new BorderRadius.circular(15),
          animationDuration: new Duration(milliseconds: 500),
          child: new TextField(
            focusNode: _focusNode,
            keyboardAppearance: Brightness.light,
            style: Theme.of(context).textTheme.headline5,
            controller: _controller,
            keyboardType: TextInputType.number,
            textAlign: TextAlign.end,
            inputFormatters: <TextInputFormatter>[
              LengthLimitingTextInputFormatter(8),
              _whichLabel(widget.label),
            ],
            decoration: new InputDecoration(
              enabledBorder: new OutlineInputBorder(
                borderRadius: new BorderRadius.circular(15),
                borderSide: new BorderSide(width: 1.2, color: CliniLiliac300),
              ),
              focusedBorder: new OutlineInputBorder(
                borderRadius: new BorderRadius.circular(15),
                borderSide: new BorderSide(width: 2.5, color: CliniLiliac300),
              ),
              filled: true,
              fillColor: Colors.white,
              hintText: "0.0",
              hintStyle: new TextStyle(fontSize: 15, color: Colors.black, fontFamily: "Montserrat"),
            ),
            onChanged: (val) {
              var cursorPos = _controller.selection;
              val = val.replaceAll(",", ".");
              if (val == "") {
                provider.fields[_label] = 0.0;
              } else if (double.parse(val) > provider.measure[_label] &&
                  provider.measure[_label] != 0) {
                provider.fields[_label] % 1 == 0
                    ? _controller.text = provider.fields[_label].toString().split(".")[0]
                    : _controller.text = provider.fields[_label].toString();

                if (cursorPos.start > _controller.text.length) {
                  cursorPos = new TextSelection.fromPosition(
                    new TextPosition(offset: _controller.text.length),
                  );
                }
                _controller.selection = cursorPos;
              } else {
                provider.fields[_label] = double.parse(val);
              }
              provider.calculateResultRA();
            },
          ),
        );
      }),
    ) : SizedBox();
  }

1 Ответ

0 голосов
/ 02 августа 2020

Используйте TextFormField вместо TextField. TextFormField имеет несколько обратных вызовов, например validator, onSaved, onChanged, onEditingComplete, onSubmitted, ...

Вы можете подключить все свои TextFormField, заключив их в Form. Этой форме следует присвоить GlobalKey, чтобы вы могли идентифицировать Form и вызывать методы на FormState.

final _form = GlobalKey<FormState>();

@override
Widget build(BuildContext context) {
  // ...

    return Form(
      key: _form,
      child: // build Material with TextFormFields
    );
}

Теперь, чтобы вызвать onSaved на каждом TextFormField, вы можете позвонить _form.currentState().save(). Чтобы сбросить каждые TextFormField, вы можете позвонить _form.currentState().reset().

Вы можете получить дополнительную информацию о том, как построить Form и о функциях, которые вы можете вызвать FomState здесь:

https://flutter.dev/docs/cookbook/forms/validation

https://api.flutter.dev/flutter/widgets/FormState-class.html

...