我可以使用以下代码在光标之前和之后打印所有文本:
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
仅在光标的同一行上找到光标之前/之后的文本?
例如,我想使用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();
}
}
答案 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;