0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RouteObserverのdidPushは反応するのに、didPopが反応しない

Posted at

現象

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],

      //~

    );
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?