一旦小部件失去焦点,如何避免 EditableText 小部件上的光标跳回字符串末尾

问题描述 投票:0回答:1

我的 flutter 应用程序中有一个 editableText 小部件。

      EditableText(
            keyboardType: TextInputType.none,
            autofocus: true,
            controller: _queryCtl,
            cursorColor: Colors.white,
            backgroundCursorColor: Colors.black,
            focusNode: tN,
            onTapOutside: (event) {
              print("tapped outside");
            },
            style: const TextStyle(
              fontSize: 32,
              color: Color.fromARGB(255, 219, 175, 42),
            ),
          )

我已禁用键盘输入。相反,我有 2 个 textButton 小部件,单击它们我将修改 textEditingController 的文本属性(_queryCtl 如上面的代码所示)。小部件如下所示:-

      Row(
          children: [
            TextButton(
              onPressed: () {
                addChar("2");
              },
              child: const Text(
                'Add 2',
              ),
            ),
            TextButton(
              onPressed: () {
                addChar("3");
              },
              child: const Text(
                'Add 3',
              ),
            ),
          ],
        )

完整代码可以在这里找到。这是一个 main.dart 文件。附:它在网络模拟器上无法按预期工作。我建议在 Android 模拟器上重现。

问题(假设我已经通过点击文本按钮输入了一些“2”和“3”):-

  1. 我将光标放在字符串中间的某个位置 可编辑文本小部件。

  2. 然后我点击一个文本按钮(说“添加 2')。结果:-“2”将被插入到所需的位置。

  3. 我现在再次点击文本按钮。结果:- 角色获得 插入到字符串的末尾,这是不希望的。

问题的直观演示。

似乎在第2步之后,光标失去了它的baseOffset并重置为字符串的长度。我不希望光标跳到字符串的末尾。我想像普通键盘一样生成字符串,但不使用键盘而是使用文本按钮。

有没有一种方法可以阻止光标在步骤 2 后跳回最后一个位置?

android flutter widget
1个回答
2
投票

TextEditingController.text
是一种方便的方法,每次使用时都会重置选择。如果你想控制选择,那么你需要设置整个
TextEditingValue
:

  void addChar(String s) {
    var insertPos = _queryCtl.selection.extentOffset;
    setState(() {
      _queryCtl.value = TextEditingValue(
        text:
            "${_queryCtl.text.substring(0, insertPos)}${s}${_queryCtl.text.substring(insertPos)}",
        selection: TextSelection.collapsed(offset: _queryCtl.selection.extentOffset + s.length),
      );
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.