0

我在试图找出如何做到这一点的正确方法时遇到了问题。基本上在我的应用程序中,我想重置用户“清理”的所有字段。我可以重置所有内容,但TextFields. 我发现解决该问题的唯一方法是使用您可以在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();
  }
4

1 回答 1

0

使用TextFormField而不是TextField. TextFormField有几个回调,如validator, onSaved, onChanged, onEditingComplete, onSubmitted, ...

您可以通过将所有TextFormFields 包装在 中来连接它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()的。

您可以在此处获取有关如何构建 aForm以及可以调用的函数的更多信息FomState

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

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

于 2020-08-02T16:27:25.383 回答