Flutter:如何知道文本中每一行的字符串长度?

问题描述 投票:0回答:1

我想实现一个具有'see more'功能的文本小部件,现在我想在第三行中获取字符串长度。这样我就可以做substring了。

下面的代码是我所做的:

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;
                    });
                  }),
          ]),
        ),
      )


    );
  }
}

所以问题是如何知道每一行的字符串长度,或者如何知道第三行的最后一个偏移量?

flutter
1个回答
0
投票

[如果您需要一个可扩展文本并仅以三行开头的组件,我建议使用一种简单的方法,如果您想知道偏移量,则需要了解字体尺寸,屏幕尺寸,字体粗细,设备方向。

Flutter本身不能为您提供,这将很难实现。.

但是,如果您希望在单击“查看更多”时展开三行文字,并且如果消失则在“查看更多”中展开,则可以使用此方法

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)))
          ]);
  }
}

在该组件中,我们使用maxlines属性来判断文本是否已展开,如果是,则为null,如果不是,则为3

© www.soinside.com 2019 - 2024. All rights reserved.