【Flutter】Shelfのアプリ復帰処理

はじめに

Flutterのパッケージに、shelfというものがあります。これは簡単にwebサーバを実現することができます。webやandroid、iosなどでwebサーバを立てることができ、またリクエストのURLごとにルーティングするshelf_routerなどと組み合わせることができます。
今回は、shelfで立ち上げたアプリの再開・復帰時の処理について書いていきます。

Flutterアプリのライフサイクル

Flutterアプリは、アプリの動作によって状態が以下のように変化していきます。

  • inactive・・・非アクティブ状態

  • paused・・・バックグラウンドに遷移した状態

  • resumed・・・フォアグラウンドに遷移した状態

  • detached・・・アプリが終了するときの状態

アプリをバックグラウンドにして他のアプリを使ったり、電源ボタンを押して、端末の画面を消したり、アプリを終了させたりすると状態が変化します。

shelfのバックグラウンド時の動作

shelfのパッケージを使用したアプリでWebサーバを起動させて、それをバックグランドにしたりすると、リクエストを受け付けなくなることがあります。
動作を確認していると、アプリがpausedの状態になっており、リクエストを受け付けられていないと考えています。※ただプラットフォームごとで少し動作が違ったので、もう少し調査できたらいいなと思います。

shelfの復帰処理

shelfがリクエストを受け付けなくなると、アプリをフォアグラウンドにしても再度リクエストを受け付けることはありませんでした。
これらを踏まえて、ライフサイクルの変化を検知して、必要な処理を実装する必要があります。
WidgetsBindingObserverを対象としたいクラスにmixinすると、didChangeAppLifecycleStateメソッドが使用できるようになります。このメソッドは、アプリのライフサイクルを監視して、メソッド内で処理を分岐させることができるようになっています。

void didChangeAppLifecycleState(AppLifecycleState state) {
  // stateの状態で処理を分岐させる
}

これによりアプリが再度復帰するときに、サーバを再起動させてあげれば、アプリが画面上に復帰してもリクエストを受け付けるようになります。

まとめ

今回はアプリのライフサイクルとshelfの問題について書きました。
ライフサイクルなどももっと知識が深められたらいいなと思います。

いいなと思ったら応援しよう!