StreamBuilder 中具有初始值的 TextField
TextField with initial value inside StreamBuilder
我们正在创建一个用户的编辑数据页面,所以文本字段已经填满了用户数据,用户可以更改并保存它...问题是当我开始在文本字段中输入字符时,光标出现丢失,我输入的每个字符(从设备键盘),光标转到第一个字符......如果我用我的初始值删除控制器,它工作正常,但我不能让我的文本字段填充用户数据。
代码示例:
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);
希望对您有所帮助!
我们正在创建一个用户的编辑数据页面,所以文本字段已经填满了用户数据,用户可以更改并保存它...问题是当我开始在文本字段中输入字符时,光标出现丢失,我输入的每个字符(从设备键盘),光标转到第一个字符......如果我用我的初始值删除控制器,它工作正常,但我不能让我的文本字段填充用户数据。
代码示例:
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);
希望对您有所帮助!