Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何从TextFormField的onPanUpdate点获取字符位置_Flutter - Fatal编程技术网

Flutter 如何从TextFormField的onPanUpdate点获取字符位置

Flutter 如何从TextFormField的onPanUpdate点获取字符位置,flutter,Flutter,我需要自定义选择文本时,PanUpdate。我正在使用TextFormField,我需要在onPanUpdate点获取字符位置。我尝试使用TextPainter,但接触点处的字符与结果不同,只选择了第一行。我怎样才能得到文本表单字段的paddingTop?我想paddingTop可能是原因。 我当前的代码: class TranslatableTextState extends State<TranslatableText> { TextEditingController tex

我需要自定义选择文本时,PanUpdate。我正在使用TextFormField,我需要在onPanUpdate点获取字符位置。我尝试使用TextPainter,但接触点处的字符与结果不同,只选择了第一行。我怎样才能得到文本表单字段的paddingTop?我想paddingTop可能是原因。 我当前的代码:

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