はじめに
こんにちは、しくみ製作所の渡辺です。
2022年1月に入社して、最近はアプリ関連の案件だと、ネイティブのコード(ほぼjava + kotlin & swift)の案件と、Flutterの案件のサポート(プルリクをレビュー等)をしたりしています。ネイティブの案件では動画プレイヤーを扱ったりしていて、なかなか大変です。今回は断続的にキャッチアップを続けているFlutterに関する記事を書こうと思います。
go_routerとriverpodを組合わせる
Flutterの中でもgo_routerの動向はかなり気になっており、少し前にやっと状態の保存ができるStatefulShellRouteが登場しました。
しかし、そもそもriverpodとShellRouteの組合わせで事足りるんじゃ無いかと思い、今回検証してみました。
まずは、一番シンプルにStatefulShellRouteを使用してみます。
しっかりbottomNavigationBar間の移動で、counterの値が保存されています。
本題から少し外れますが、bottomNavigationBarには、NavigationBarを与えています。これは、Material 3に適応した新しいWidgetです。
これをriverpodとShellRouteで書き換えたのが、下記のコードです。
※動画は全く同じなので、割愛します。
ここでのポイントは @Riverpod(keepAlive: true)
の部分です。
riverpod_generatorが生成するコードはautoDisposeがデフォルトなので、keepAlive: true
にしないと画面を遷移したときにproviderが破棄されるようです。
コードを見ると、StatefulShellRouteの時より長くなってます。また、上記に記載したコードの他にriverpod_generatorが生成したコードもあるので、もうちょっとだけ長くなります。
商用のアプリでは、もっと複雑な状態を管理しないといけないと思います。riverpodのようなパッケージを導入しないのは難しいと思いますので、ちょっとくらいコードが長くなるのはしょうがないかなと思います。
さいごに
今回使ったサンプルコードを下記に置いてあります。
今後もFlutterやモバイルに関する投稿を続けていきたいと思います。