この記事は 2020 年(React Navigation v5)時点の記録です(2026 年 7 月 追記)
2 点、大きく変わりました。使っているパッケージが 2 度移されて、最終的に廃止されています。そして、タブを隠す方法についても公式の推奨が別にあります。順にお伝えします。
1. material-bottom-tabs は廃止されました
- v6 の時点で
@react-navigation/material-bottom-tabsは react-native-paper へ移管されました。React Navigation の公式ドキュメントも「paper 側を参照してください」という案内になっています- さらに
react-native-paper@5.14.0でcreateMaterialBottomTabNavigator自体が非推奨になりました現在の推奨は、
@react-navigation/bottom-tabsの 7 系と、react-native-paper のBottomNavigation.Barを組み合わせる形です。Material Design の見た目はそのまま保てます。本文の
barStyleという指定も、この構成では使いません。読み替えが必要です。2. タブを隠すなら、公式は構造を変えることをすすめています
ここが本題です。本文では Redux でグローバルな状態を持ち、
displayを切り替えていますが、React Navigation の公式ドキュメントは別の方法を案内しています。よくある構造はこうなっています。
タブナビゲーター ├ Home(スタック) ├ Feed(スタック) └ Profile ← ここでもタブが残ってしまう公式が推奨するのは、入れ子の向きを逆にすることです。
スタックナビゲーター ├ Tabs(最初の画面。この中にタブナビゲーター) ├ Profile ← タブの外なので、そもそも出ない └ Settings ← 同上タブを出したくない画面を、最初からタブの外に置くという考え方です。
3. なぜそちらのほうがよいのか
本文の方法の弱点は、記事自身が示しています。「Go to Home ボタン」で
dispatchし、さらに「左上の戻るボタン」でもdispatchする——と、画面から出る経路すべてに後始末を書く必要があります。ひとつでも書き忘れると、タブが消えたまま戻ってきます。Android の物理バックボタン、スワイプでの戻る操作、ディープリンクからの遷移——経路は増えていきます。全部を追いかけるのは現実的ではありません。
構造で解決すれば、状態管理そのものが不要になります。Redux も要りません。
4. それでも動的に切り替えたい場合
構造を変えられない事情もあると思います。その場合、現在の
@react-navigation/bottom-tabsにはtabBarStyleという画面ごとのオプションがあり、画面の設定としてdisplay: 'none'を指定できます。グローバルな状態を持たずに済むぶん、本文の方法より安全です。ただし、この方法にも制約があることが公式のフォーラムでも議論されています。まずは構造の見直しを検討してみてください。
※ 上記は 2026 年 7 月時点の React Navigation および react-native-paper の公式ドキュメントの記載に基づく整理であり、当方の環境での再検証は行っていません。
条件・関連リソース
React Navigation v5 + React Native Paper を使い React Native アプリを開発する時、createMaterialBottomTabNavigator で作成した Tab を非表示にするため、tabBarVisible: false オプションを使っても何故か効かなかったので調べてみたら以下の公式サイトでは material-bottom-tabs だけ tabBarVisible オプションが見当たらなかったし、ネットで検索しても古い情報しかなかったので自分のやり方で解決 ( 回避 ) してみました。
以下は公式サイト:
- React Native Paper > BottomNavigation
- React Navigation > createMaterialBottomTabNavigator
条件:
- Redux ToolkitでReduxを楽に使う〜React-Native〜 の「方法 #4:RTK + Redux Hooks」 を利用し設定します。
- Stack Screen の
HeaderはReact Native PaperのAppbarを利用しています。 - この記事の内容は
material-bottom-tabsだけに該当します。
関連リソース:
@react-navigation/material-bottom-tabs 5.1.0@react-navigation/native 5.0.8@react-navigation/stack 5.1.0@reduxjs/toolkit 1.2.5react-native-paper 3.6.0react-redux 7.2.0redux 4.0.5- など。。
実現したいこと!
MaterialBottomTab ( Parent Navigator )
└─ HomeStack ( Child Navigator )
└─ Home Screen
└─ Details Screen ◀︎このスクリーンを開くと Tab を非表示にしたい!
設定方法
- Step 1解決方法を見つける
この記事は Tab bar can now be hidden #20 のリンクから始まりました。
... if (!this._isVisible()) { barStyle['display'] = 'none'; ...barStyledisplaynone。。なるほど! - Step 2barStyle オブジェクトを設定します。
const MaterialBottomTab = createMaterialBottomTabNavigator();で作成したファイルが対象です。以下の
barStyleオブジェクトにisTabVisible変数がfalseになると Tab を隠すように設定を追加します。( 変数名はすべて任意 )// 'none'ではないと、効きません! ... return ( <MaterialBottomTab.Navigator initialRouteName={INITIAL_ROUTE_NAME} barStyle={{ display: isTabVisible ? null : "none" }} ... - Step 3Tab の条件をコントロールする State 値を設定します。
ここで Redux Store を利用します。( 詳細:方法 #4:RTK + Redux Hooks )
useSlice で Reducer を作成します。
- Tab の初期状態 (
isTabVisible) を表示 (true) に。 - アクションクリエーター:
setTabVisibility - State 値:
action.payload
// MaterialBottomTabSlice.js import { createSlice } from "@reduxjs/toolkit"; const MaterialBottomTabSlice = createSlice({ name: "MaterialBottomTab Control", initialState: { isTabVisible: true }, reducers: { setTabVisibility: (state, action) => { Object.assign(state, { isTabVisible: action.payload }); } } }); export const { setTabVisibility } = MaterialBottomTabSlice.actions; export default MaterialBottomTabSlice.reducer;MaterialBottomTabNavigator を設定します。
Parent Navigator :
useSelectorを利用し State 値isTabVisibleを取得します。取得した State 値で以下のように条件分岐します。
▶︎display: isTabVisible ? null : "none"// MaterialBottomTabs.js 抜粋 import { useSelector } from "react-redux"; const MaterialBottomTab = createMaterialBottomTabNavigator(); export function MaterialBottomTabsScreen() { const isTabVisible = useSelector(state => state.tabs.isTabVisible); .. return ( <MaterialBottomTab.Navigator initialRouteName={INITIAL_ROUTE_NAME} barStyle={{ backgroundColor: theme.dark ? activeSurfaceColor : theme.colors.primary, display: isTabVisible ? null : "none" }} - Tab の初期状態 (
- Step 4Stack Screenを設定します。
Child Screen :
Tab を隠すスクリーンで State 値を設定します。
Home Screen から Details Screen に遷移すると、
useEffectを使いsetTabVisibilityアクションクリエーターをdispatchしてRedux Storeを更新します。dispatch(setTabVisibility(false));することで Tab が非表示に変わります。また、
Details Screenから離れる場合はtrueに戻します。下記の例では
Go to Homeボタンをタップすると Tab が表示されます。// Details.js import { setTabVisibility } from "redux/reducers/MaterialBottomTabSlice"; import { useDispatch } from "react-redux"; ... function DetailsScreen({ navigation }) { const dispatch = useDispatch(); React.useEffect(() => { dispatch(setTabVisibility(false)); }, []); return ( <JScrollView> <View style={{ alignItems: "center", justifyContent: "center" }}> <JText>Details Screen</JText> <Button onPress={() => { navigation.navigate("Home"); dispatch(setTabVisibility(true)); }} mode="outlined" > Go to Home </Button>画面左上の Back ボタンをタップする場合も設定します。
<Appbar.BackAction/>にdispatch(setTabVisibility(true));を追加すれば OK です。import { Appbar, Avatar } from "react-native-paper"; import { setTabVisibility } from "redux/reducers/MaterialBottomTabSlice"; import { useDispatch } from "react-redux"; const JAppbarHeader = ({ scene, previous, navigation }) => { const dispatch = useDispatch(); .. {previous ? ( <Appbar.BackAction onPress={() => { navigation.goBack(); dispatch(setTabVisibility(true)); }} /> ...これで設定は完了です!
動作確認
Redux Store の設定は以下の通りです。
...
const rootReducer = combineReducers({
tabs: MaterialBottomTabReducer
});
...
まとめ
React navigation で material-bottom-tabs に tabBarVisible が使えなくても以上のやり方でも臨機応変策としては有効かと思います。( Android / iOS )
また、Redux Store の設定方法の詳細は別の記事になっていますので、興味のある方はご参考ください。


コメント