まえおき
Flutter3.16対応時にWillPopScope
がdeprecatedになるため、今後はPopScope
を使う必要があり、その際に1点罠にハマったのでメモ
概要
PopScope
のonPopInvoked
内でNavigator.of(context).pop();
を使用するとonPopInvoked
が呼ばれてしまいます。
例
PopScope(
canPop: false,
onPopInvoked: (didPop) async {
if (await webViewController.canGoBack()) {
await controller.goBack();
} else {
if (context.mounted) {
Navigator.of(context).pop();
}
}
}...
);
対策
popが行われるさいはdidPopがtrueになるので、canPopを常にfalseにしている場合は、didPopがtrueの場合は処理を行わないようにすれば回避できます。
PopScope(
canPop: false,
onPopInvoked: (didPop) async {
if (didPop) {
return;
}
if (await controller.canGoBack()) {
await controller.goBack();
} else {
if (context.mounted) {
Navigator.of(context).pop();
}
}
}...
);
感想
そもそもWillPopScope時のコードをそのまま使っているのが悪い気がするので、PopScopeに合わせて書き直した方がいいのかなと思います。
追記(2024/02/01)
iOSにてcanPopをfalseにするとback gestureがうまく動かないようです。
PopScope does not invoke
onPopInvoked
for iOS back gesture whencanPop
set to false · Issue #138624 · flutter/flutter
https://github.com/flutter/flutter/issues/138624