var text="Clita takimata dolor diam magna aliquyam et sed dolores sadipscing. Sed ut
diam rebum labore sadipscing sit amet, diam labore.";
final span=TextSpan(text:text);
final tp =TextPainter(text:span,maxLines: 3,textDirection: TextDirection.ltr);
tp.layout(maxWidth: MediaQuery.of(context).size.width); // equals the parent screen width
print(tp.didExceedMaxLines);
//false for maxlines 3
//true for maxlines 1
6条答案
按热度按时间wfsdck301#
如果您只是想知道文本包含多少内部行,可以执行一个简单的
然而,我猜您更感兴趣的是实际上可视化显示的行数。在这里,事情变得有点复杂,因为您需要知道可用空间(
BoxConstraints
),以便计算文本需要多少行。为此,您可以使用LayoutBuilder
来延迟小部件构建,并使用TextPainter
来执行实际计算:我从
auto_size_text
pub package中提取了一些代码,您可能也会感兴趣:它调整文本的大小,使其适合给定的空间。无论如何,在显示提示时要小心:您的小部件的
build
方法可能会在一秒钟内被调用多次,从而导致同时显示多个提示。注意:
computeLineMetrics()
函数是在答案的初始版本之后添加的。这就是为什么这个答案的前一个版本使用TextPainter(text: span, maxLines: 3)
,然后检查是否为tp.didExceedMaxLines
。e4yzc0pl2#
现在很容易找到一个段落的行数:
注意事项
computeLineMetrics
必须在布局后调用。参见
lstz6jyr3#
更新:这个答案是出于历史目的。参见my updated answer here以获得更简单的解决方案。
如果你有一个
TextPainter
对象,并且你已经调用了layout
,那么你可以通过选择所有内容并调用getBoxesForSelection
来获得行数。每个框都是线的大小。下面是一个例子:
不幸的是,如果存在双向文本的混合,这将失败:
这可以通过仅计数沿着一个边缘的框来克服。如果你注意上面的数据,只有四个盒子的边为0.0。
我希望有一个
TextPainter.numberOfLines
方法,但我还没有找到它。iszxjhcz4#
我只是得到了这段代码的支持,因此这就是我如何验证它是否穿过最大线
hgtggwj05#
在我的情况下,我需要得到的行数来改变它的基础上的高度,而是我使用堆栈部件作为一个工作。下面是我的代码:
eagi6jfj6#
只需放置属性maxLines:null和TextInputAction.done,如果您希望将新行限制为特定的限制计数“\n”。