使用后退按钮颤振测试 WillPopScope

Posted

技术标签:

【中文标题】使用后退按钮颤振测试 WillPopScope【英文标题】:Flutter testing WillPopScope with back button 【发布时间】:2021-03-22 04:12:33 【问题描述】:

在我的主页小部件上,当用户点击系统后退按钮时,它会通过 WillPopScope 显示一个确认对话框小部件。 我想测试这个对话框,但我不知道如何按下测试文件上的后退按钮。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,但我的应用程序中没有返回按钮。我想测试android系统的后退按钮。我就是这样做的。也许对遇到和我一样问题的人有帮助。

testWidgets("test onWillPop",(WidgetTester tester) async 
    bool willPopCalled = false;
    await tester.pumpWidget(
      MaterialApp(
        home: Scaffold(
          body: WillPopScope(
            onWillPop: () async 
              willPopCalled = true;
              return false;
            ,
            child: Container(),
          ),
        ),
      ),
    );

    final dynamic widgetsAppState = tester.state(find.byType(WidgetsApp));
    await widgetsAppState.didPopRoute();
    await tester.pump();

    expect(willPopCalled, true);
);

灵感来自:https://github.com/flutter/flutter/blob/master/packages/flutter/test/material/will_pop_test.dart

【讨论】:

为什么不试试这个expect(await widgetsAppState.didPopRoute(), isTrue);呢? 这是个人喜好的情况,我个人从未测试过Flutter框架本身的功能。我编写的代码 sn-p 只是如何触发后退按钮的一个示例。在正常情况下,您在源项目中定义了您的小部件,并且您希望按下后退按钮时会发生一些事情。我只会断言可疑的结果。【参考方案2】:

我不知道如何按下测试文件上的后退按钮。

这将帮助您查看应用栏(应用顶部)上的后退按钮。它将允许您通过 appbar 查看返回按钮

return WillPopScope(
  onWillPop: _onWillPop,
  child: Scaffold(
    appBar: AppBar(
      title: Text("Title"),
      centerTitle: true,
      leading: IconButton(
        icon: Icon(Icons.arrow_back, color: Colors.black),
        onPressed: () => _onWillPop(),
      ),
    ),
    body: Body(),
  ),
);

_onWillPop 将成为您问题的“确认对话框小部件”。

【讨论】:

【参考方案3】:

显然,您无法在测试中访问Navigator。所以我的解决方案是在抽水小部件中的某处包含BackButton,然后像这样弹出页面:

await tester.pumpWidget(MaterialApp(
  home: Scaffold(
    body: Container(
      child: BackButton(),
    ),
  ),
));

...

await tester.pageBack();

【讨论】:

以上是关于使用后退按钮颤振测试 WillPopScope的主要内容,如果未能解决你的问题,请参考以下文章

颤振:如何在按下后退按钮时不退出应用程序

使用颤振驱动程序中的系统后退按钮

颤振回调到后退按钮上的原始小部件

在颤动中打开对话框时检测返回按钮按下

在 Flutter 中使用带有 WillPopScope 的嵌套导航器

在颤振中,按下后退按钮时如何返回上一个 URL?