現象
Flutterにて、画面遷移時のイベントをハンドリングして処理をしたくて、いろいろ検索しながらコード書いてみたけどうまくいかない。
didPush(画面が開いたとき)のみハンドリングできて、他のdidPop(画面閉じるとき)とかは無反応。。。
main.dart
@override
Widget build(BuildContext context) {
return MaterialApp(
// ~
observers: ObserverStates.routeObserver,
// ~
)
}
page.dart
class _MyPageState extends State<MyPage> with RouteAware {
// ~
@override
void didChangeDependencies() {
super.didChangeDependencies();
ObserverStates.routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
}
@override
void didPopNext() {
debugPrint("didPopNext ${runtimeType}");
}
// こいつだけ動く
@override
void didPush() {
debugPrint("didPush ${runtimeType}");
}
@override
void didPop() {
debugPrint("didPop ${runtimeType}");
}
@override
void didPushNext() {
debugPrint("didPushNext ${runtimeType}");
}
@override
void dispose() {
ObserverStates.routeObserver.unsubscribe(this);
super.dispose();
}
// ~
}
原因&解決
私のアプリだと、MaterialAppの配下にNavigatorでタブ毎にrootを作成しているので、こっちに設定しなきゃいけなかったらしい。
要は、Navigator単位でObserverを用意してやる必要があるってこと。
(MaterialAppのObserverに設定しても、Navigator内の画面遷移は検知できんよってこと。だったらdidPushも反応しないでくれよ。。。)
tab.dart
return Navigator(
// ~
observers: [ObserverStates.routeObserver],
//~
);