Flutter 如何知道文本中每行的字符串长度?
我想创建一个具有“查看更多”功能的文本小部件。我想得到第三行的字符串长度,这样我就可以做子字符串了 以下代码是我目前掌握的代码:Flutter 如何知道文本中每行的字符串长度?,flutter,Flutter,我想创建一个具有“查看更多”功能的文本小部件。我想得到第三行的字符串长度,这样我就可以做子字符串了 以下代码是我目前掌握的代码: class ExpandedTextState extends State<ExpandedTextWidget> { String firstHalf; String secondHalf; bool flag = true; @override void initState() { super.initState();
class ExpandedTextState extends State<ExpandedTextWidget> {
String firstHalf;
String secondHalf;
bool flag = true;
@override
void initState() {
super.initState();
TextPainter textPainter = new TextPainter();
textPainter.maxLines = 3;
textPainter.text = TextSpan(text: widget.text);
textPainter.textDirection = TextDirection.ltr;
textPainter.layout(maxWidth: double.infinity , minWidth: 0.0);
if(textPainter.didExceedMaxLines){
firstHalf = widget.text.substring(0, 50); //substring here
secondHalf = widget.text.substring(50, widget.text.length);
}else{
firstHalf = widget.text;
secondHalf = "";
}
}
@override
Widget build(BuildContext context) {
return new Container(
padding: new EdgeInsets.symmetric(horizontal: 10.0, vertical: 10.0),
child: secondHalf.isEmpty
? new Text(firstHalf)
: Container(
child: new RichText(
text: TextSpan(children: [
TextSpan(
text: flag ? (firstHalf + "...") : (firstHalf + secondHalf),
style: TextStyle(fontSize: 13, color: Colors.amber),),
TextSpan(
text: flag ? "see more" : "",
style: TextStyle(fontSize: 13, color: Colors.black),
recognizer: new TapGestureRecognizer()
..onTap = () {
setState(() {
flag = !flag;
});
}),
]),
),
)
);
}
}
类ExpandedTextState扩展状态{
串上半段;
串后半部分;
布尔标志=真;
@凌驾
void initState(){
super.initState();
textpainer textpainer=新的textpainer();
textpainer.maxLines=3;
textpainer.text=TextSpan(text:widget.text);
textpainer.textDirection=textDirection.ltr;
textPainter.layout(最大宽度:double.infinity,最小宽度:0.0);
if(textpainer.dideExceedMaxLines){
firstHalf=widget.text.substring(0,50);//此处为substring
secondHalf=widget.text.substring(50,widget.text.length);
}否则{
firstHalf=widget.text;
后半段=”;
}
}
@凌驾
小部件构建(构建上下文){
退回新货柜(
填充:新边集。对称(水平:10.0,垂直:10.0),
孩子:第二个半小时。我是空的
?新文本(上半部分)
:容器(
孩子:新富文本(
text:TextSpan(子项:[
TextSpan(
文本:标志?(前半部分+“…):(前半部分+后半部分),
样式:TextStyle(字体大小:13,颜色:Colors.琥珀色),
TextSpan(
文本:标志?“请参阅更多”:“,
样式:TextStyle(字体大小:13,颜色:Colors.black),
识别器:新的TapGestureRecognizer()
…onTap=(){
设置状态(){
flag=!flag;
});
}),
]),
),
)
);
}
}
如何知道每行中的字符串长度,或者如何知道第三行的最后偏移量?如果您想要一个只以三行展开文本并开始的组件,我建议使用一种简单的方法,如果您想要知道偏移量,您需要知道字体尺寸、屏幕尺寸、字体重量,设备方向 颤振本身不能给你这个,它会有点难以实现 但是,如果您希望文本有3行,在单击“查看更多”时展开,并且如果它展开为“查看更多”幻象,则可以使用这种方法
class ExpandableText extends StatefulWidget {
@override
_ExpandableTextState createState() => _ExpandableTextState();
}
class _ExpandableTextState extends State<ExpandableText> {
final String text =
'ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp';
bool isExpanded = false;
@override
Widget build(BuildContext context) {
return isExpanded
? Text(text + text + text,
style: TextStyle(fontSize: 13, color: Colors.amber))
: Column(children: <Widget>[
Text(text + text + text,
maxLines: 3,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 13, color: Colors.amber)),
GestureDetector(
onTap: () => setState(() => isExpanded = true),
child: Text('See More...',
style: TextStyle(fontSize: 13, color: Colors.black)))
]);
}
}
class ExpandableText扩展StatefulWidget{
@凌驾
_ExpandableTextState createState()=>\u ExpandableTextState();
}
类_ExpandableTextState扩展状态{
最终字符串文本=
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp;
bool-isExpanded=false;
@凌驾
小部件构建(构建上下文){
返回是扩展的
?文本(文本+文本+文本,
样式:TextStyle(字体大小:13,颜色:Colors.amber))
:列(子项:[
文本(文本+文本+文本,
maxLines:3,
溢出:TextOverflow.省略号,
样式:TextStyle(字体大小:13,颜色:Colors.amber)),
手势检测器(
onTap:()=>setState(()=>isExpanded=true),
子项:文本('查看更多…',
样式:TextStyle(字体大小:13,颜色:Colors.black)))
]);
}
}
在该组件中,我们使用maxlines属性来判断文本是否展开,如果展开,则为null,如果展开,则为3谢谢您的回复。但是当我运行你的代码时,“查看更多”并没有出现。哎哟,我忘记了TextSpan行为,检查编辑后的答案,它看起来更“基本”,但实际上textpan就是这样工作的。缺点是列小部件是一个彩票,有时它会填满它应该填充的空间,有时它不会,它的概念在那里,但您可能需要根据您的小部件树进行调整