在TextField中的当前编辑行上的光标之前/之后获取文本

时间:2019-12-27 06:31:48

标签: flutter dart

我可以使用以下代码在光标之前和之后打印所有文本:

controller = TextEditingController();
final selection = controller.value.selection;
final text = controller.value.text;
print("\nBEFORE\n${selection.textBefore(text)}");
print("\nAFTER\n${selection.textAfter(text)}\n");

如何使用TextEditingController仅在光标的同一行上找到光标之前/之后的文本?

TextField with line of lin<<cursor>>e2 contents

例如,我想使用TextEditingController查询光标当前位置之前/之后的文本,因此之前的文本为“ lin”,而光标之后的文本为“ e2 contents”(在上图)。

完整的应用程序代码,可在光标之前/之后获取所有文本(不在要求的同一行):

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: TextFieldApp()));

class TextFieldApp extends StatefulWidget {
  @override
  _TextFieldAppState createState() => _TextFieldAppState();
}

class _TextFieldAppState extends State<TextFieldApp> {
  TextEditingController controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: TextField(
        keyboardType: TextInputType.multiline,
        controller: controller,
        maxLines: 10,
        maxLength: null,
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  void initState() {
    controller = TextEditingController();
    controller.text = 'line 1\nline2 contents\nline3';
    controller.addListener(() {
      final selection = controller.value.selection;
      final text = controller.value.text;
      print("\nBEFORE\n${selection.textBefore(text)}");
      print("\nAFTER\n${selection.textAfter(text)}\n");
    });
    super.initState();
  }
}

1 个答案:

答案 0 :(得分:1)

您可以用\n分割文本,然后从数组中获取最后一个值。 同样,此文本之后的第一个条目。

final selection = controller.value.selection;
final text = controller.value.text;
final before = selection.textBefore(text);
final after = selection.textAfter(text);
print(before.split('\n').last);
print(after.split('\n').first);

注意:

如果用户在内容为cont的行中选择line2 contents,那么他们将是

line2 //before
ents  //after

如果您需要文本“之后”也具有“选定文本”, 您可以将文本“内部”添加到文本“之后”。

selection.textInside(text) + after.split('\n').first;