0

我正在构建一个 CustomPaint 小部件,以使用 ParagraphBuilder 以自定义方式显示文本,并将其命名为 myHtmlWidget。

我的问题是如何在绘制之前确定小部件的高度?我试图在 MyHtmlPainter 的构造函数中调用 ParagraphBuilder 并测量高度,但那里没有宽度

这是我的构建树的一部分:

Widget myHtmlWidget(List<dom.Element> spans, TextAlign ebookTextAlign) {
    var painter = MyHtmlPainter(spans, ebookTextAlign);
    return CustomPaint(
      painter: painter,
      child: Container(
        height: 550, // **** THIS IS THE PROBLEM, I WANT IT TO MATCH/FIT TO THE HEIGHT OF RENDERED TEXT
      ),
    );
  }

这是 MyHtmlPainter:

class MyHtmlPainter extends CustomPainter {
  List<dom.Element> spans;
  TextAlign ebookTextAlign;

  ui.Paragraph paragraph;

  MyHtmlPainter(this.spans, this.ebookTextAlign);

  @override
  void paint(Canvas canvas, Size size) {
    var pin = Offset(0, 0);
    // To create a paragraph of text, we use ParagraphBuilder.
    final ui.ParagraphBuilder builder = ui.ParagraphBuilder(
      ui.ParagraphStyle(
        textDirection: ui.TextDirection.rtl,
        textAlign: ebookTextAlign,
        fontSize: ebookMainTextSize,
      ),
    )
      ..pushStyle(ui.TextStyle(color: const ui.Color(0xFF000000)));

    spans.forEach((spn) {
      if (spn.localName == "p")
        builder.addText("\n");
      builder.addText(spn.text + " ");
    });
    builder.pop();

    paragraph = builder.build()

      ..layout(ui.ParagraphConstraints(width: size.width));
    canvas.drawParagraph(paragraph, pin);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    // TODO: implement shouldRepaint
    return null;
  }
}
4

0 回答 0