【问题标题】:Proper way to close dialogs in Flutter tests在 Flutter 测试中关闭对话框的正确方法
【发布时间】:2020-03-13 10:37:25
【问题描述】:

Flutter 的 WidgetTester 有一个 pageBack() 方法用于弹出路由堆栈。当我使用 MaterialPageRoute 的 fullscreenDialog 属性将页面作为全屏对话框打开时,pageBack() 方法不起作用(“屏幕上应该有一个后退按钮”)。我找不到该工作的替代方法。

在 Flutter 测试中取消/关闭对话框的标准方法是什么?

我可以按如下方式关闭对话框:

await tester.tap(find.byIcon(Icons.close));

但是我可以改为使用pageBack(),如下所示:

await tester.tap(find.byIcon(Icons.arrow_back));

为什么有pageBack() 方法却没有关闭对话框的等效方法?

我还没有编写我的 Cupertino UI。该测试是否需要寻找不同的图标?

另请参阅类似的problem I had with selecting the overflow menu

更新:也许pageBack() 模拟按下系统后退按钮,而不是后退箭头?在这种情况下,无需在 iOS 上模拟该行为,无论如何我都必须通过图标找到后退按钮来模拟按下它。

【问题讨论】:

    标签: testing flutter


    【解决方案1】:

    您可以有一个对话框,其中包含一个带有文本“X”的按钮,该按钮会弹出对话框。 这个按钮,你可以找到

    await tester.tap(find.text('X'));
    

    别忘了用水龙头抽水

    await tester.pumpAndSettle();
    

    查看 Flutter 团队用于测试对话框的完整代码示例:source code

    【讨论】:

      【解决方案2】:

      我认为 Icons.close 的发现似乎是合理的。我在我的应用程序中做了类似的事情。另一种选择可能是假设导航栏中按钮的 x,y 并点击屏幕上的该位置。

      【讨论】:

        【解决方案3】:

        我之前遇到过类似的问题,我发现以下解决方案非常适合我的情况。

        Navigator.of(context, rootNavigator: true).pop('dialog')
        

        或者你可以这样写,

        Navigator.of(context).pop();
        Navigator.pop(context);  
        

        您可以在此处查看Flutter Navigation and Routing 上的简要文档。

        希望,这会奏效。祝你有美好的一天。

        【讨论】:

        • 谢谢,但上下文不可用于测试。测试通过 WidgetTester 驱动。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        相关资源
        最近更新 更多