颤振中的段落类有一个名为getBoxesForRange的方法。
文档说:
返回包含给定文本范围的文本框列表。
但是,我不清楚这些框是包含给定范围的文本行周围的框,还是其他的框。
在做了进一步的研究之后,我找到了一个答案,我在下面添加。
发布于 2020-12-11 09:58:54
简短回答
Paragraph.getBoxesForRange给出了如果选择的话,它实际上是给定范围的突出显示区域。如果范围包装到一个新行(或者包含混合的双向文本),您将得到多个框。
较长答案
给定字符串:
Hello, world.如果您将范围从1到8,如下所示:
final boxes = paragraph.getBoxesForRange(1, 8);这会给你一个盒子:
[
TextBox.fromLTRBD(22.3, -0.3, 112.0, 35.0, TextDirection.ltr)
]用图形表示,它将如下所示:

这表明这些框不是完整的行,而是仅包装指定的文本范围。
如果限制宽度,使段落被迫换行文本,则会得到以下内容:

[
TextBox.fromLTRBD(22.3, -0.3, 47.0, 35.0, TextDirection.ltr),
TextBox.fromLTRBD(0.0, 34.7, 41.8, 70.0, TextDirection.ltr),
TextBox.fromLTRBD(0.0, 69.7, 23.2, 105.0, TextDirection.ltr)
]全码
这是完整的代码,如果你想玩它自己。
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: HomeWidget(),
),
);
}
}
class HomeWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: CustomPaint(
size: Size(300, 300),
painter: MyPainter(),
),
);
}
}
class MyPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final textStyle = ui.TextStyle(
color: Colors.black,
fontSize: 30,
);
final paragraphStyle = ui.ParagraphStyle(
textDirection: TextDirection.ltr,
);
final paragraphBuilder = ui.ParagraphBuilder(paragraphStyle)
..pushStyle(textStyle)
..addText('Hello, world.');
final constraints = ui.ParagraphConstraints(width: 300);
// final constraints = ui.ParagraphConstraints(width: 50);
final paragraph = paragraphBuilder.build();
paragraph.layout(constraints);
canvas.drawParagraph(paragraph, Offset.zero);
final boxes = paragraph.getBoxesForRange(1, 8);
print(boxes);
final paint = Paint()
..color = Colors.blue
..style = PaintingStyle.stroke
..strokeWidth = 1;
for (final box in boxes) {
final rect = Rect.fromLTRB(box.left, box.top, box.right, box.bottom);
canvas.drawRect(rect, paint);
}
}
@override
bool shouldRepaint(CustomPainter old) {
return false;
}
}https://stackoverflow.com/questions/65249200
复制相似问题