📝

persistent_bottom_nav_bar_v2×TabBarで別BottomBarから別BottomBarのTabBarを操作する

2023/04/09に公開

概要

persistent_bottom_nav_bar_v2で永続化したボトムナビゲーションに2つのスクリーンを用意し、1つのスクリーンに複数タブのページを用意します。

この構成で複数タブのページでないページから目的のタブに遷移する方法を紹介します

また、ボトムナビゲーションと選択されているタブの状態管理はriverpodで行います

前提条件

・Flutter(dart)の基本的な書き方が分かる
・riverpod、riverpod_generatorの基本的な書き方が分かる
・persistent_bottom_nav_bar_v2の基本的な書き方が分かる

バージョン

・Flutter 3.7.10
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/pubspec.yaml#L11-L26

実装

PersistentTabControllerプロバイダを作成

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/state/bottom_nav.dart#L6-L12

ボトムナビゲーションバーの状態を管理するプロバイダです。
initialIndexを変えることで、最初にビルドされた際に選択されるボトムナビゲーションのタブが変わります。
※本記事でinitialIndexを1にするとDetailページが最初に表示されます

ボトムナビゲーションのUI構築

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/main.dart#L30-L61

SelectTabBarプロバイダを作成

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/state/detail_tab.dart#L5-L15
Detailスクリーンにおける、どのタブを選択しているかの状態を保持します。
riverpod_generatorを使用する場合、(keepAlive: true)を忘れないようにしてください。
(Detail2を選んでいたのに、HomePageに戻ると状態が破棄され、Detailスクリーンに戻ると、Detail1になってしまう)
changeTabForDetailNでそれぞれのDetailページに遷移する状態に変更されます

HomePageのUI構築

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L7-L50

要点を解説します

bottomNavControllerProviderの状態をreadで取得

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L12
ボトムナビゲーションバーの状態は、今回の構成では監視する(watch)必要はありません。
readで取得し、PersistentTabControllerのjumpToTabを使用します。

Detail1・2・3のボタンを押下するとボトムナビゲーションのタブをDetailスクリーンが選択されるようにする

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L26
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L34
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L42

Detail1・2・3のボタンを押下するとDetailPageの各タブに合うをDetailNページが選択されるようにする

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L25
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L33
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/home_page.dart#L41

DetailPageのUI構築

https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/detail_page.dart#L7-L56

TabControllerの作成

TabControllerクラスを使用したいので、
StatefulWidgetのStateにTickerProviderStateMixinを継承し、tabControllerを作成します
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/detail_page.dart#L16

SelectTabBarプロバイダを監視

Detailスクリーンの選択されているタブを管理するSelectTabBarプロバイダを監視します。
また、変更されたらTabControllerのindex(どのタブが選択されているか)を変更します。
https://github.com/sukekyo000/persist_nav_bar_tab_bar/blob/main/lib/ui/detail_page.dart#L19-L20

まとめ

以上が別スクリーンからタブを変化させる方法でした。

間違っている点や質問があれば、是非コメントいただきたいです!

Discussion