我创建了一个注册表单,其中包含一些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通过验证(没有快照。错误)后,代码才起作用。如果所有字段的值都正确,我可以毫无问题地更改焦点。