我的 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”):-
我将光标放在字符串中间的某个位置 可编辑文本小部件。
然后我点击一个文本按钮(说“添加 2')。结果:-“2”将被插入到所需的位置。
我现在再次点击文本按钮。结果:- 角色获得 插入到字符串的末尾,这是不希望的。
似乎在第2步之后,光标失去了它的baseOffset并重置为字符串的长度。我不希望光标跳到字符串的末尾。我想像普通键盘一样生成字符串,但不使用键盘而是使用文本按钮。
有没有一种方法可以阻止光标在步骤 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),
);
});
}