3

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

代码示例:

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),
        ),
  ),
4

3 回答 3

14

每当您需要更新 TextController 文本时,为了能够对其进行编辑,您需要像这样修复光标位置

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

用新文本替换 NEW_VALUE 。

于 2018-12-08T14:20:44.317 回答
8

@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,
      );
    });
于 2019-01-06T22:16:36.607 回答
2

要将光标放在文本的末尾,当您编辑文本控制器时,请考虑像这样编辑您的选择控制器:

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

希望它有所帮助!

于 2020-03-17T16:17:43.573 回答