我正在努力弄清楚如何将一个小部件 相对于屏幕上的另一个 居中OverlayEntry
(在一个内部 )。Overlay
Widget
以下是我到目前为止的代码的简化版本(假设它是 a StatefulWidget
):
class _MyIconState extends State<MyIcon> {
// Here I get the RenderBox for the MyIcon widget and its size and coordinates
late final renderedWidget = context.findRenderObject() as RenderBox;
late final renderedOffset = renderedWidget.localToGlobal(Offset.zero);
late final renderedSize = renderedWidget.size;
// This is the OverlayEntry with the Text() Widget I'd love to center below MyIcon
late final entry = OverlayEntry(
builder: (context) => Positioned(
top: renderedOffset.dy + renderedSize.height,
left: renderedOffset.dx + (renderedSize.width / 2),
child: Text(
widget.message ?? 'Test',
textAlign: TextAlign.center,
),
),
),
);
@override
Widget build(BuildContext context) {
return widget.action != null
? GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
if (widget.action != null) {
widget.action!();
_showTooltip();
} else {
_showTooltip();
}
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Icon(widget.icon),
),
)
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Icon(widget.icon),
);
}
_showTooltip() {
// The screen overlay
final overlay = Overlay.of(context)!;
overlay.insert(entry);
}
}
本质上,当点击图标本身时,创建并在下方放置Overlay
一个工具提示Text
(作为一个)。OverlayEntry
MyIcon
问题是这行代码:renderedOffset.dx + (renderedSize.width / 2)
.
MyIcon
我可以将工具提示中的文本从Text
.
为了使其居中,我需要像这样定位它:renderedOffset.dx + (renderedSize.width / 2) - (renderedTextWidth/2)
,但是它Text
是动态的,我看不出有什么办法知道和解释它的宽度(在示例中,renderedTextWidth
)。
我知道Tooltip
Flutter 中已经有一个很好的小部件可以简化我的生活。不幸的是,一些要求(独立于手头的问题)不允许我使用它。所以我必须想出一些定制的东西。
这大约是我最终的结果: 我希望红线或多或少垂直对齐
大家有没有遇到过这样的问题,或者对类似的事情有一些经验?您对如何处理/解决问题有任何提示吗?
感谢您的任何帮助。