StreamBuilder中具有初始值的TextField



我们正在创建一个用户的编辑数据页面,因此文本字段已经填充了用户数据,用户可以更改和保存它…问题是,当我开始在文本字段中输入字符时,光标会丢失,我输入的每个字符(从设备键盘(,光标都会转到第一个字符。。。如果我用我的初始值删除控制器,它会很好地工作,但我不能用用户数据填充我的文本字段。

代码示例:

child: StreamBuilder<String>(
stream: _bloc.myStream,
builder: (context, snap) => TextField(
decoration: InputDecoration(
hintText: 'example',
labelText: 'Name',
errorText: snap.error,
),
onChanged: _bloc.updateMyStream,
controller: TextEditingController(text: snap.data),
),
),

每当你需要更新你的TextController文本时,为了能够编辑它,你需要像这个一样固定你的光标位置

textController.value = textController.value.copyWith(text:<NEW_VALUE>,);

用新文本替换NEW_VALUE。

@XoXo这里是完整的代码,但你可以用自己的方式来做。

TextEditingController _controller = TextEditingController();
return StreamBuilder<String>(
stream: _bloc.myStream,
builder: (context, snap) {
_controller.value =
_controller.value.copyWith(text: snap.data);
return TextField(
decoration: InputDecoration(
hintText: 'ex: Centro',
labelText: 'Bairro',
errorText: snap.error,
),
onChanged: _bloc.updateMyStream,
controller: _controller,
);
});

要使光标位于文本的末尾,当您编辑文本控制器时,请考虑也编辑您的选择控制器,如下所示:

controller.text = newText;
controller.selection = controller.selection.copyWith(baseOffset: newText.length, extentOffset: newText.length);

希望它能有所帮助!

相关内容

  • 没有找到相关文章

最新更新