◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-04-28中級

Rork で Bottom Tab のアイコンが消える・タブが切り替わらない症状の修正ガイド

Rork製アプリのBottom Tabでアイコンが表示されない、タップしても切り替わらない、本番ビルドだけ消えるという3つの症状パターンを切り分けて修正します。expo-routerの構成で起きやすい原因と修正手順を、実際のコード例と予防策つきでまとめました。

Rork585expo-router3Bottom Tabナビゲーション3トラブルシューティング85

Bottom Tab は完成していると気持ちのいい部品なのですが、Rork で生成したコードに少し手を入れた瞬間、アイコンだけが消えたり、タップしても画面がうんともすんとも言わなくなったりすることがあります。私自身、Rork でアプリを量産しているうちに「同じ症状を 3 回以上踏んでいるな」と気づいて整理したのが、この記事の内容です。

困ったときに「どこを最初に見るべきか」を分かっている人だけが、サクッと数分で直せるところを、知らないと半日溶かす。そんな性格のバグなので、症状を 3 つのパターンに切り分けてから順に潰していくのが結局いちばん早いです。

症状を 3 つに切り分けてから手を動かす

まず、闇雲に _layout.tsx をいじる前に、いまのバグがどのパターンに当てはまるかを切り分けます。Rork で発生する Bottom Tab 系のトラブルは、私の経験ではほぼ次の 3 種類に集約されます。

  • パターン A: アイコンだけ表示されない(タブの切り替え自体は動く)
  • パターン B: タブをタップしても画面が切り替わらない(アイコンは出る)
  • パターン C: 開発ビルドでは動くのに本番ビルドだけアイコンが消える

A と B では原因がまったく違うので、同じ手順で直そうとすると遠回りします。最初に Expo Go や Rork Companion で動作確認し、自分のケースがどれかを 1 分で判定してから次に進みます。

パターン A: アイコンが表示されないとき

このケースは、tabBarIcon に渡している関数の 戻り値の型 か icon ライブラリのインポート がほぼ確実に怪しいです。Rork が初期生成するコードはたいてい lucide-react-native を使いますが、ここを別のライブラリに差し替えた直後に空白になることが多いです。

// app/(tabs)/_layout.tsx
import { Tabs } from "expo-router";
import { Home, Settings, User } from "lucide-react-native";
 
export default function TabLayout() {
  return (
    <Tabs
      screenOptions={{
        // ❌ NG: 関数を返さない / size が undefined のまま渡る
        // tabBarIcon: <Home />,
 
        // ✅ OK: ({ color, size }) => ReactNode の形を守る
        tabBarActiveTintColor: "#0070f3",
        headerShown: false,
      }}
    >
      <Tabs.Screen
        name="index"
        options={{
          title: "Home",
          tabBarIcon: ({ color, size }) => <Home color={color} size={size} />,
        }}
      />
      <Tabs.Screen
        name="settings"
        options={{
          title: "Settings",
          tabBarIcon: ({ color, size }) => <Settings color={color} size={size} />,
        }}
      />
    </Tabs>
  );
}

ポイントは 3 つです。(1) tabBarIcon は必ず関数で渡すこと、(2) color と size を props に流すこと、(3) lucide-react-native を使う場合は react-native-svg がインストール済みであること。react-native-svg が無いと、エラーは出ないのにアイコンだけ静かに消えます。expo install react-native-svg をたたいてから再ビルドすると、ピタッと出てきます。

パターン B: タップしても画面が切り替わらないとき

タブ自体は表示されているのにタップが効かない場合は、ファイル名とルート名のミスマッチを疑います。expo-router は app/(tabs)/ 配下のファイル名を自動でルートに割り当てるので、<Tabs.Screen name="profile" /> と書いておきながら app/(tabs)/Profile.tsx(先頭大文字)になっていると、対応が取れずに無反応になります。

修正の流れは次のとおりです。app/(tabs)/ の中身を確認して、ファイル名がすべて 小文字 + ハイフン になっていることを確認し、name= の値と一致させます。あわせて _layout.tsx の <Tabs.Screen name="..." /> 順がファイルの存在順と齟齬していないかも見ます。

もう一つよく踏むのが、Stack を入れ子にしたタブで initialRouteName を間違えるケースです。タブ内でさらに Stack を持たせる場合は、各サブ画面の最初のルートを明示しておかないと、タップしても「タブの中の何も無いルート」へ遷移してしまい、画面が動かないように見えます。原因の見つけ方やデバッグ手順は、expo-router でナビゲーションエラーが出るときの対処 にも詳しくまとめています。

パターン C: 本番ビルドだけアイコンが消える

開発中はちゃんと動いていたのに、TestFlight や本番 APK にしたとたん Bottom Tab のアイコンが空白になります。これは、Metro の tree-shaking とアイコンライブラリの相性で起きることが多いです。lucide-react-native のように動的インポートを内部で使うライブラリは、本番ビルドの最適化で参照を見失うことがあります。

対処は次の順で試すのが効率的です。

  • まず metro.config.js で resolver.unstable_enableSymlinks を有効にしていないかを確認します。trueにしているとモジュール解決が崩れることがあります
  • app.json の experiments.tsconfigPaths を試験的に外して再ビルドする
  • それでも直らない場合は、react-native-vector-icons や @expo/vector-icons の安定したセットに置き換える

@expo/vector-icons は Expo SDK に同梱されていて Bottom Tab 用途では事故が少なく、私はトラブル時のフォールバックとして第一候補にしています。アイコンセットを切り替えると、内部的には別パッケージになるので、本番ビルドの挙動も変わります。

つまずきやすいポイントと予防策

事前に避けられたら避けたいポイントを 3 つだけ書いておきます。

  • 「アイコンが消える=設定ミス」と決めつけない。react-native-svg 未インストール、Hermes エンジン側の問題など、外側の依存関係が原因のことが半数くらいあります
  • Tabs.Screen の name とファイル名を 1 対 1 で合わせる。Rork の AI に「タブを追加して」と頼むと、たまにここがズレた状態で生成されるので、生成直後にファイルツリーを見て確認するクセをつけます
  • 本番ビルドは TestFlight で必ず確認する。Companion アプリで動いている=本番でも動く、ではありません。リリース直前に気づいて慌てないように、テスト工程に「Tab の見た目チェック」を 1 行入れておくだけで保険になります

似た系統の症状で UI が更新されないケースは state が更新されない・再レンダリングされない問題の修正 も参考になるので、原因の切り分けに迷ったら覗いてみてください。

全体を振り返って — 直したあとに 1 つだけやっておくこと

修正できたら、その日のうちに app/(tabs)/_layout.tsx をひとつのコンポーネントに切り出して、ファイル先頭に「Bottom Tab を追加するときの手順」を 3 行コメントで残しておくのをおすすめします。次に同じバグを踏むのは未来の自分か、共同開発者です。「アイコンを足したら react-native-svg を確認」「name= とファイル名を一致」「本番ビルドで TestFlight 確認」。この 3 行のチェックリストが、半日の時間を救ってくれることが何度もありました。

シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⬡ 開発ツール2026-10-15
EXPO_PUBLIC_ の値が、開発では読めて本番だけ undefined になる書き方を、変換結果で見分けます
API の URL が開発中は読めるのに、ビルドした途端に undefined になる。原因は process.env の書き方でした。babel-preset-expo の変換結果を開発・本番で並べ、置き換わる書き方と残ってしまう書き方を表にしました。
⬡ 開発ツール2026-10-07
日本語の見出しだけ太字にならない — Android で fontWeight が効かないときの切り分けと直し方
Rork で作ったアプリで、iPhone では太字なのに Android では日本語の見出しが細いままになる症状の切り分け記事です。原因の見分け方、fontFamily を重みごとに分ける直し方、確認用コードを載せています。
⬡ 開発ツール2026-09-21
exit code 0 で止まるビルド — ログを黙らせていた設定と、空ファイルを通した存在チェック
eas build --local が exit code 0 but produced no further output で止まる件と、0 バイトのスタブが埋め込まれず dyld で落ちる件。どちらも原因は出力を減らす設定でした。自分のスクリプトを棚卸しする手順まで書き残します。