在StreamBuilder

时间:2018-12-08 13:12:46

标签: controller flutter textfield default-value stream-builder

我们正在创建用户的编辑数据页面,因此文本字段中已经充满了用户数据,用户可以对其进行更改并保存...问题是,当我开始在文本字段中输入字符时,光标会丢失,我输入的每个字符(从设备键盘输入)都将光标移到第一个字符...如果我将控制器的初始值删除,则可以正常工作,但是无法用用户数据填充文本字段

代码示例:

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 个答案:

答案 0 :(得分:3)

每当需要更新TextController文本时,要进行编辑,就需要像这样固定光标位置

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

用新文本替换NEW_VALUE。

答案 1 :(得分:1)

@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,
      );
    });

答案 2 :(得分:1)

要使光标移至文本的末尾,请在编辑文本控制器时考虑也可以像这样编辑选择控制器:

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

希望有帮助!

答案 3 :(得分:0)

如果您的TextFieldStatefulWidget内部(可能),最好在didChangeDependencies方法内部进行赋值。典型示例:

  @override
  void didChangeDependencies() {
    textEditingController.value = TextEditingValue(text: bloc.valueController.value);
    super.didChangeDependencies();
  }