Flutter 如何知道TextWidget将包装到哪里?
当使用带有大字符串的Flutter 如何知道TextWidget将包装到哪里?,flutter,Flutter,当使用带有大字符串的文本小部件时,显示的文本被拆分为两行或多行 我的问题很简单:如何知道字符串被分割的确切字符 我已经在Textcode中进行了挖掘。直到dart:ui的段落。但我还没有找到任何有用的东西 实际上,flatter中的文本是使用一个函数绘制在画布上的,该函数在运行时使用其父类的框约束计算布局大小。如果已经知道可用空间,可以计算文本的布局宽度,并将其与可用宽度进行比较,以了解文本将在何处中断 您可以使用textpainer计算文本的宽度,如: final TextPainter pa
文本
小部件时,显示的文本被拆分为两行或多行
我的问题很简单:如何知道字符串被分割的确切字符
我已经在
Text
code中进行了挖掘。直到dart:ui
的段落
。但我还没有找到任何有用的东西 实际上,flatter中的文本是使用一个函数绘制在画布上的,该函数在运行时使用其父类的框约束计算布局大小。如果已经知道可用空间,可以计算文本的布局宽度,并将其与可用宽度进行比较,以了解文本将在何处中断
您可以使用textpainer
计算文本的宽度,如:
final TextPainter paint = new TextPainter(
text: new TextSpan(
text: "Hello World",
),
textDirection: TextDirection.ltr
);
paint.layout();
debugPrint(paint.width.toString());
您也可以使用
CustomPainter
这样做:
import 'package:flutter/material.dart';
void main() {
String text = "Hello World";
void textShownOnUI(int size){
debugPrint(text.substring(0,size));
}
runApp(new MaterialApp(
title: "Example",
home: new Container(
width: 100.0,
padding: const EdgeInsets.all(175.0),
child: new CustomPaint(
painter: new MyTextWidget(
text: text,
style: new TextStyle(),
notifySize: textShownOnUI
),
child: new Container(),
),
),
));
}
class MyTextWidget extends CustomPainter {
Function notifySize;
String text;
TextStyle style;
TextDirection direction;
MyTextWidget({this.text,this.notifySize,this.style,this.direction});
@override
void paint(Canvas canvas, Size size){
debugPrint(size.width.toString());
final TextPainter _painterWithConstrains = new TextPainter(
text: new TextSpan(
text: text,
style: style
),
textDirection: direction??TextDirection.ltr
);
String _willBeShownOnUI = text;
int _size = text.length;
TextPainter _temp = new TextPainter(
text: new TextSpan(
text: _willBeShownOnUI,
style: style
),
textDirection: direction??TextDirection.ltr
);
_painterWithConstrains.layout(maxWidth: size.width);
_temp.layout();
while(_temp.width > _painterWithConstrains.width && _size != 0){
debugPrint(_temp.width.toString()+" "+ _size.toString());
_willBeShownOnUI = _willBeShownOnUI.substring(0, --_size);
_temp = new TextPainter(
text: new TextSpan(
text: _willBeShownOnUI,
style: style
),
textDirection: direction??TextDirection.ltr
);
_temp.layout();
}
_size = _willBeShownOnUI.split(" ")[0].length; // Get complete words that will be shown
Function.apply(notifySize,<int>[_size]);
_painterWithConstrains.paint(canvas, Offset.zero);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
导入“包装:颤振/材料.省道”;
void main(){
String text=“Hello World”;
无效文本ShowNonUI(整数大小){
debugPrint(text.substring(0,大小));
}
runApp(新材料)PP(
标题:“示例”,
家:新集装箱(
宽度:100.0,
填充:常数边集全部(175.0),
孩子:新油漆(
画家:新的MyTextWidget(
文本:文本,
样式:新建TextStyle(),
notifySize:textShownOnUI
),
子级:新容器(),
),
),
));
}
类MyTextWidget扩展了CustomPainter{
功能尺寸;
字符串文本;
文本风格;
文本方向;
MyTextWidget({this.text,this.notifySize,this.style,this.direction});
@凌驾
空心油漆(帆布,尺寸){
debugPrint(size.width.toString());
最终TextPainter _painterWithConstraints=新的TextPainter(
text:newtextspan(
文本:文本,
风格:风格
),
text方向:方向??textDirection.ltr
);
字符串_willBeShownOnUI=文本;
int _size=text.length;
TextPainter _temp=新的TextPainter(
text:newtextspan(
文本:_willbeshownoui,
风格:风格
),
text方向:方向??textDirection.ltr
);
_painterWithConstraints.layout(maxWidth:size.width);
_临时布局();
而(_temp.width>_painterWithConstraints.width&&u size!=0){
debugPrint(_temp.width.toString()+“”+_size.toString());
_willBeShownOnUI=\u willBeShownOnUI.substring(0,--\u size);
_temp=新文本绘制程序(
text:newtextspan(
文本:_willbeshownoui,
风格:风格
),
text方向:方向??textDirection.ltr
);
_临时布局();
}
_size=\u willBeShownOnUI.split(“”[0]。length;//获取将显示的完整单词
apply(notifySize,[\u size]);
_painterWithConstraints.paint(画布,偏移量.0);
}
@凌驾
bool shouldRepaint(CustomPainter oldDelegate)=>true;
}
希望有帮助 是的,我也看到了。但这不是我需要的。我不想知道最终结果的维度;而是把绳子切成两段。这是为了潜在地提取第二行,并将其显示在另一个小部件上。这是通过将文本切片直到计算的布局和可用空间匹配来计算布局。但是该部分在代码> > dAR:UI > /Cult>中,用C++编写。因此,问题是:我如何访问它?我想你无法直接找到它,相反,你可以将文本包装在一个已知宽度的容器中。这根本不适合我的用例