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++编写。因此,问题是:我如何访问它?我想你无法直接找到它,相反,你可以将文本包装在一个已知宽度的容器中。这根本不适合我的用例