在 Flutter 中使用控制器设置文本时 TextField 光标不移动

Posted

技术标签:

【中文标题】在 Flutter 中使用控制器设置文本时 TextField 光标不移动【英文标题】:TextField cursor not moving when setting text using controller in Flutter 【发布时间】:2019-05-31 22:49:20 【问题描述】:

我正在使用StreamBuilder 来监听 TextField 的更改并相应地更新 TextField errorText。但是现在我也想通过快照数据给 TextField 设置一些文本。但是打字时光标根本不动。以下是我的代码:

Widget goalField() 
    return StreamBuilder(
        stream: _bloc.goalMessage,
        builder: (BuildContext context, AsyncSnapshot<String> snapshot) 
          return TextField(
            controller: TextEditingController(text: snapshot.data),
            keyboardType: TextInputType.multiline,
            maxLines: 3,
            onChanged: _bloc.changeGoalMessage,
            decoration: InputDecoration(
                hintText: "Enter your goal here", errorText: snapshot.error),
          );
        );
  

它在一个循环中进行。我该如何解决这个问题?

【问题讨论】:

***.com/a/53683436/10269042 感谢它的工作@anmol.majhail 【参考方案1】:

我已尝试使用 _textEditingController.value.copyWith(text: snapshot.data) 在 cmets 中建议的解决方案,但每次更新 TextField 上显示的值时,光标似乎都位于文本的开头。

对我有用的是使用 _textEditingController.selection.copyWith(extentOffset: _textEditingController.text.length) 在 TextField 上设置偏移量。

以下是如何将其应用于您的代码 sn-p。

var _textEditingController = TextEditingController();

...

StreamBuilder(
    stream: _bloc.goalMessage,
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) 
        _textEditingController.text = snapshot.data;
        _textEditingController.selection = _textEditingController.selection.copyWith(extentOffset: _textEditingController.text.length);
        return TextField(
            controller: _textEditingController,
            keyboardType: TextInputType.multiline,
            maxLines: 3,
            onChanged: _bloc.changeGoalMessage,
            decoration: InputDecoration(
                hintText: "Enter your goal here", errorText: snapshot.error),
        );
    ,
);

【讨论】:

以上是关于在 Flutter 中使用控制器设置文本时 TextField 光标不移动的主要内容,如果未能解决你的问题,请参考以下文章

Flutter中TextField的TextScaleFactor?

如何在 Flutter 中将 textEditiing 控制器与 Provider 一起使用

如何在按钮单击时在 SwiftUI 中为 TextField 设置文本

Boostnote for Mac——如何使用TeX精美地编写数学公式

编辑文本控制器更新小部件值而不调用 setState() - Flutter

Flutter开发之基础Widget