TextField控制器问题进入StreamBuilder

时间:2019-04-30 08:36:28

标签: dart flutter

我创建了一个注册表单,其中包含一些TextField小部件,并通过BLOC Stream进行了验证,并且一切正常。在尝试添加“清除所有字段”按钮之后,添加了TextEditingController,但是现在我遇到了一个奇怪的问题。 如果我开始写到字段中,我会看到我正在写的错误标签和文本。只要我写了一个有效的输入就可以了(文本就可以了,清除就可以了……。一切都很好)。 问题是:如果我在字段A中写了一个字符(因此我获得了错误标签),然后将焦点更改为字段B,则在字段A中所有字符都消失了。 实际上:如果我不符合某个字段的验证规则,则无法删除焦点,否则内容将消失。

解决此问题的唯一方法是删除控制器,但这种方式无法以编程方式清除内容

Widget _createNameField(HomePageBloc bloc) {
    return StreamBuilder(
      stream: bloc.name,
      builder: (BuildContext context, snapshot) {
        if (snapshot.data != null) {
          var cursorPos = _nameFieldController.selection; // Cursor workaround
          _nameFieldController.text = snapshot.data;
          // Cursor workaround
          if (cursorPos.start > _nameFieldController.text.length) {
            cursorPos = new TextSelection.fromPosition(
                new TextPosition(offset: _nameFieldController.text.length));
          }
          _nameFieldController.selection = cursorPos;
          // End workaround
        }

        return TextField(
          onChanged: (name) => bloc.changeName(name),
          controller: _nameFieldController,
          decoration: InputDecoration(
            labelText: 'Enter your name',
            errorText: snapshot.error,
            suffixIcon: IconButton(
              icon: Icon(Icons.clear),
              onPressed: () {
                _nameFieldController.clear();
                bloc.changeName("");
              },
            ),
          ),
        );
      },
    );
  }

直到TextField通过验证(没有快照。错误)后,代码才起作用。如果所有字段的值都正确,我可以毫无问题地更改焦点。

0 个答案:

没有答案