hamburger-tech-nits

主にプログラミングのNITSな話

Flutterで画面遷移のイベントを検知して別の処理を呼び出す

画面遷移のたびに特定の処理を実行したい時はNavigatorObserverで処理を呼び出せる。

NavigatorObserverのサブクラスを作成する

class MyNavigatorObserver extends NavigatorObserver {
  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    // 画面遷移が完了した後に実行したい処理を記述します。
    print('画面遷移が完了しました。');
  }
}

Navigatorに登録する

NavigatorのnavigatorObserversに、作成したMyNavigatorObserverのインスタンスを登録する。go_routerを利用しているときは、observersに設定する。

Navigator(
  // ...
  navigatorObservers: [MyNavigatorObserver()],
  // ...
);

これで、画面遷移が完了するたびにMyNavigatorObserverdidPushメソッドが呼ばれて指定した処理が実行するようになる。

NavigatorObserverには他の画面遷移イベントに対応するメソッドも用意されているので、必要に応じて実装を追加する。引数でルーティングの情報を受け取れるので、それで特定の画面では処理をスキップする、みたいなこともできる。

class MyNavigatorObserver extends NavigatorObserver {
  @override
  void didPush(Route route, Route? previousRoute) {
    super.didPush(route, previousRoute);
  }

  @override
  void didPop(Route route, Route? previousRoute) {
    super.didPop(route, previousRoute);
  }

  @override
  void didReplace({Route? newRoute, Route? oldRoute}) {
    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
  }

  @override
  void didRemove(Route route, Route? previousRoute) {
    super.didRemove(route, previousRoute);
  }
  
  @override
  void didStopUserGesture() {
    super.didStopUserGesture();
  }
}