Flutter 如何从TextFormField的onPanUpdate点获取字符位置
我需要自定义选择文本时,PanUpdate。我正在使用TextFormField,我需要在onPanUpdate点获取字符位置。我尝试使用TextPainter,但接触点处的字符与结果不同,只选择了第一行。我怎样才能得到文本表单字段的paddingTop?我想paddingTop可能是原因。 我当前的代码:Flutter 如何从TextFormField的onPanUpdate点获取字符位置,flutter,Flutter,我需要自定义选择文本时,PanUpdate。我正在使用TextFormField,我需要在onPanUpdate点获取字符位置。我尝试使用TextPainter,但接触点处的字符与结果不同,只选择了第一行。我怎样才能得到文本表单字段的paddingTop?我想paddingTop可能是原因。 我当前的代码: class TranslatableTextState extends State<TranslatableText> { TextEditingController tex
class TranslatableTextState extends State<TranslatableText> {
TextEditingController textEditingController = TextEditingController();
TextPainter textPainter = TextPainter();
GlobalKey mainText = new GlobalKey();
@override
void initState() {
super.initState();
textEditingController.addListener(() {
textPainter.text = TextSpan(text: textEditingController.text);
});
textPainter.textDirection = TextDirection.ltr;
textEditingController.text =
" I guess you're more interested in the number of lines that are actually being displayed visually. Here, things ge";
}
bool setSize = false;
void _onMove(Offset local, BuildContext context) {
if (!setSize) {
setSize = true;
final RenderBox renderBoxRed = mainText.currentContext.findRenderObject();
final sizeRed = renderBoxRed.size;
textPainter.layout(maxWidth: sizeRed.width, minWidth: 20);
}
setState(() {
final RenderBox renderBox = context.findRenderObject();
int offset = textPainter
.getPositionForOffset(renderBox.globalToLocal(local))//convert global point to widget point
.offset;
Characters chars = textEditingController.text.characters;
print("________________$offset ${chars.elementAt(offset)}");//the result not same in touched char
int start = -1;
for (int i = offset - 1; i >= 0; i--) {
if (regExp.hasMatch(chars.elementAt(i))) {
start = i + 1;
break;
}
}
if (start < 0) start = 0;
int end = -1;
for (int i = offset; i < chars.length; i++) {
if (regExp.allMatches(chars.elementAt(i)) != null) {
end = i - 1;
break;
}
}
if (end < 0) end = chars.length;
textEditingController.selection =
TextSelection(baseOffset: start, extentOffset: end);
print("____________$start $end");
});
}
RegExp regExp = new RegExp(r"\s");
@override
Widget build(BuildContext context) {
return GestureDetector(
onPanUpdate: (DragUpdateDetails details) {
_onMove(details.localPosition, context);
},
onTapUp: (TapUpDetails details) {
_onMove(details.localPosition, context);
},
child: TextFormField(
decoration: InputDecoration(contentPadding: EdgeInsets.all(0)),
readOnly: true,
focusNode: FocusNode(canRequestFocus: false),
key: mainText,
controller: textEditingController,
maxLines: null,
),
);
}
}
类translateabletextstate扩展状态{
TextEditingController TextEditingController=TextEditingController();
textpainer textpainer=textpainer();
GlobalKey mainText=新的GlobalKey();
@凌驾
void initState(){
super.initState();
textEditingController.addListener((){
textpainer.text=TextSpan(text:textEditingController.text);
});
textpainer.textDirection=textDirection.ltr;
text编辑控制器.text=
“我想你对实际显示的行数更感兴趣;
}
bool setSize=false;
void _onMove(偏移本地,构建上下文){
如果(!setSize){
设置大小=真;
final RenderBox renderBoxRed=mainText.currentContext.findenderobject();
最终尺寸=renderBoxRed.size;
textPainter.layout(最大宽度:sizeRed.width,最小宽度:20);
}
设置状态(){
final RenderBox RenderBox=context.findenderobject();
int offset=textpainer
.getPositionForOffset(renderBox.globalToLocal(local))//将全局点转换为小部件点
.抵销;
Characters chars=textEditingController.text.Characters;
print(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu$offset${chars.elementAt(offset)}”);//触摸字符的结果不同
int start=-1;
对于(int i=offset-1;i>=0;i--){
if(regExp.hasMatch(chars.elementAt(i))){
开始=i+1;
打破
}
}
如果(开始<0)开始=0;
int end=-1;
for(int i=偏移量;i