@@ -70,6 +70,8 @@ interface Props<Route extends BaseRoute> {
70
70
} ) => ImageSource | undefined ;
71
71
}
72
72
73
+ const ANDROID_MAX_TABS = 6 ;
74
+
73
75
const TabView = < Route extends BaseRoute > ( {
74
76
navigationState,
75
77
renderScene,
@@ -87,9 +89,18 @@ const TabView = <Route extends BaseRoute>({
87
89
// @ts -ignore
88
90
const focusedKey = navigationState . routes [ navigationState . index ] . key ;
89
91
90
- if ( navigationState . routes . length > 6 ) {
91
- throw new Error ( 'TabView only supports up to 6 tabs' ) ;
92
- }
92
+ const trimmedRoutes = useMemo ( ( ) => {
93
+ if (
94
+ Platform . OS === 'android' &&
95
+ navigationState . routes . length > ANDROID_MAX_TABS
96
+ ) {
97
+ console . warn (
98
+ `TabView only supports up to ${ ANDROID_MAX_TABS } tabs on Android`
99
+ ) ;
100
+ return navigationState . routes . slice ( 0 , ANDROID_MAX_TABS ) ;
101
+ }
102
+ return navigationState . routes ;
103
+ } , [ navigationState . routes ] ) ;
93
104
94
105
/**
95
106
* List of loaded tabs, tabs will be loaded when navigated to.
@@ -103,18 +114,18 @@ const TabView = <Route extends BaseRoute>({
103
114
104
115
const icons = useMemo (
105
116
( ) =>
106
- navigationState . routes . map ( ( route ) =>
117
+ trimmedRoutes . map ( ( route ) =>
107
118
getIcon ( {
108
119
route,
109
120
focused : route . key === focusedKey ,
110
121
} )
111
122
) ,
112
- [ focusedKey , getIcon , navigationState . routes ]
123
+ [ focusedKey , getIcon , trimmedRoutes ]
113
124
) ;
114
125
115
126
const items : TabViewItems = useMemo (
116
127
( ) =>
117
- navigationState . routes . map ( ( route , index ) => {
128
+ trimmedRoutes . map ( ( route , index ) => {
118
129
const icon = icons [ index ] ;
119
130
const isSfSymbol = isAppleSymbol ( icon ) ;
120
131
@@ -130,7 +141,7 @@ const TabView = <Route extends BaseRoute>({
130
141
badge : props . getBadge ?.( { route } ) ,
131
142
} ;
132
143
} ) ,
133
- [ getLabelText , icons , navigationState . routes , props ]
144
+ [ getLabelText , icons , trimmedRoutes , props ]
134
145
) ;
135
146
136
147
const resolvedIconAssets : ImageSource [ ] = useMemo (
@@ -145,9 +156,7 @@ const TabView = <Route extends BaseRoute>({
145
156
) ;
146
157
147
158
const jumpTo = useLatestCallback ( ( key : string ) => {
148
- const index = navigationState . routes . findIndex (
149
- ( route ) => route . key === key
150
- ) ;
159
+ const index = trimmedRoutes . findIndex ( ( route ) => route . key === key ) ;
151
160
152
161
onIndexChange ( index ) ;
153
162
} ) ;
@@ -163,7 +172,7 @@ const TabView = <Route extends BaseRoute>({
163
172
} }
164
173
{ ...props }
165
174
>
166
- { navigationState . routes . map ( ( route ) => {
175
+ { trimmedRoutes . map ( ( route ) => {
167
176
if ( getLazy ( { route } ) !== false && ! loaded . includes ( route . key ) ) {
168
177
// Don't render a screen if we've never navigated to it
169
178
if ( Platform . OS === 'android' ) {
@@ -176,7 +185,7 @@ const TabView = <Route extends BaseRoute>({
176
185
< View
177
186
key = { route . key }
178
187
style = { [
179
- { width : '100%' , height : '100%' } ,
188
+ styles . fullWidth ,
180
189
Platform . OS === 'android' && {
181
190
display : route . key === focusedKey ? 'flex' : 'none' ,
182
191
} ,
0 commit comments