2年近くFlutterをやっていて、データストアにRiverpodを使っている場合 StatefulWidget
はまじで要らない子なんじゃないかと思い始めている。disposeする対象の管理が面倒でメモリリークする可能性があり、良いことがない。コードも色々増える。
StatefulWidgetを使いたい=initStateを使いたいだと思うけど、画面が表示される度にイベントを発火したい的なことであれば、操作するデータストアのあるProviderをrefresh
するとか、autoDispose
で破棄するとか、listen
でリスナーを作るなどを組み合わせれば、同等のことが出来る。
個人的にはautoDisposeを使うケースがほとんどなくて、子画面に遷移する時に常に最新化したい場合と、Streamを取り扱う時。StreamによってUIを構築する場合、そのUIがスクリーンから消えた時にStreamを自動的に閉じたいのと、ref.onDispose
でやりたいことがある時ぐらいか。
今までやった中でStatefulWidgetの扱いが難しく感じたのは、アプリ内課金(in_app_purchase)の所。公式サンプルコード、はっきり言ってグチャグチャ。これでちゃんと動くんかいって思う。
これをConsumerWidget
で一本化するのが、Riverpod中級者になるための壁だなと思っている。今はConsumerStatefulWidget
でベタベタにやっている。サブスクとアプリ内アイテムで画面が分かれているので、IAPのゴニョゴニョを解決するだけを作りたみ。
- 各Storeからアイテムを取得するAsyncValue→ref.refreshを叩いて毎回ロード
- PurchaseStreamを監視するためのStateNotifierの用意
- 【Flutter Dart】Firebase Authenticationを使って匿名認証を実装!HooksとRiverpodを利用! に近い
アプリ内課金はサーバーサイドのコードが複雑なので(レシート検証やサブスクのイベント通知に伴うハンドリングなど)予算が許すのあればRevenueCatのようなアプリ内課金管理サービスに抱かれる方が断然楽です。月間収入が$1000未満なら無料。それ以上は、$1000単位で$8です。1万ドルだと80$。148円換算で、月間148万の売上に対して利用料が11840円。0.8%ですか。かなり安い原価率のように感じました。
だいたいのことはFlutterで出来るようになった。やっていきだ。