エミュレーターや実機上で動かすIntegration testで画面を閉じたいシーンがありました。しかしながら画面を閉じる時にWillPopScopeウィジェットのonWillPopイベントである処理を実装していたのですが、これが動いてくれていませんでした。
当初はIntegration testの中で以下のようなコードで画面を閉じていました。
(tester.state(find.byType(Navigator)) as NavigatorState).pop();
await tester.pumpAndSettle();
これだとただ画面を閉じただけになっていて、OnWillPopイベントが動いていませんでした。
Androidの戻るボタンを押す動きになればいいのかと色々ググったところ、以下のコードが出てきましたがエラーになって動いてくれませんでした。
await tester.tap(find.byTooltip('Back')); // find.byTooltip('戻る')という記事も見かけましたがエラーは変わらず
await tester.pumpAndSettle();
以下のコードも見かけましたがやはり動かず。
await Process.run(
'adb',
<String>['shell', 'input', 'keyevent', 'KEYCODE_BACK'],
runInShell: true,
);
await tester.pumpAndSettle();
AppBarの戻るボタンにキーを設定してそれをタップさせましたが、画面すら閉じてくれませんでした。
await tester.tap(find.byKey(const ValueKey('app_bar_back')));
await tester.pumpAndSettle();
最終的には以下のコードでいけました。
final dynamic widgetsAppState = tester.state(find.byType(WidgetsApp));
await widgetsAppState.didPopRoute();
きちんとルートを意識してpopさせるというような感じでしょうか。いまいち分かっていませんがとりあえず動いたのでよしとします。