在Flutter测试中如何获取小部件的位置?

4

如何在Flutter测试中获得小部件的位置?理想情况下应该是小部件的中心位置,但左上角坐标也可以。

这是我的测试和尝试编写一个函数来查找小部件在屏幕上的位置。

  testWidgets('Pin is in center of screen', (WidgetTester tester) async {
    await _setUp(tester); // Does setup
    final findPin = find.byKey('pin');
    final pinLocation = _getLocation(findPin.evaluate().first);
    print(ui.window.physicalSize);
    expect(pinLocation.dx, 1200.0);
    expect(pinLocation.dy, 900.0);
  });

Offset _getLocation(Element element) {
  return (element.findRenderObject() as RenderBox).localToGlobal(Offset.zero);
}

ui.window.physicalSize(其中uidart:ui软件包)的打印信息告诉我尺寸为Size(2400.0, 1800.0)。然而,当我在我的测试中设置这些中点时,测试失败了,说尺寸实际上是395.0和305.0。我的小部件只有30.0 x 30.0的尺寸,即使是395 +/- 30,在1200范围内也不相等。

在我的测试中,我将小部件放在一个预定义宽度(400)和高度(300)的容器中,虽然这不是它在实际应用程序中的样子,但出于测试目的,它更接近 - 给出195和155的“中心”,而不是应该是200和150。

我正在测试的小部件(在代码中,而不是在我的testWidgets中使用额外的Container)大致如下:

return Center(
    child: Container(
      key: Key('pin'),
      height: 30.0, 
      width: 30.0, 
      color: Colors.pink,
   ),
);
1个回答

13

WidgetTester有您正在寻找的方法,例如:

tester.getCenter(findPin);

我不知道为什么,但认为文档中只有加粗的方法可用。谢谢!我尝试了这个(具体来说,使用了 findPin.at(0)),当我将我的小部件包装在 400x300 的容器周围时,得到了一个几乎正确的中心位置 210。我本来期望中心位置是 200。我会再做一些调整。然而,当我移除该容器(因为我的真实应用程序没有它)时,我仍然得到了 dx 410(而不是 ~1200)。 - Mary
你好@Mary,欢迎来到Stack Overflow!如果你觉得这个答案有帮助,请使用勾选图标将其标记为解决方案。这将使其他人在寻找其他地方之前更容易看到它的有效性,并且你也会获得声望积分;-) - Bondolin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接