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就是这样工作的。缺点是列小部件是一个彩票,有时它会填满它应该填充的空间,有时它不会,它的概念在那里,但您可能需要根据您的小部件树进行调整