@@ -95,46 +95,52 @@ export function BottomSheetView({ state, descriptors }: Props) {
95
95
[ colors . border ] ,
96
96
) ;
97
97
98
- return (
99
- < BottomSheetModalProvider >
100
- { state . routes . map ( ( route , i ) => {
101
- const { options, navigation, render } = descriptors [ route . key ] ;
102
-
103
- // Top route is the content the bottom sheet is going to be rendered over.
104
- if ( i === 0 ) {
105
- return render ( ) ;
106
- }
98
+ // Avoid rendering provider if we only have one screen.
99
+ const shouldRenderProvider = React . useRef ( false ) ;
100
+ shouldRenderProvider . current =
101
+ shouldRenderProvider . current || state . routes . length > 1 ;
107
102
108
- const {
109
- index,
110
- backgroundStyle,
111
- handleIndicatorStyle,
112
- snapPoints = DEFAULT_SNAP_POINTS ,
113
- ...sheetProps
114
- } = options ;
103
+ const firstScreen = descriptors [ state . routes [ 0 ] . key ] ;
104
+ return (
105
+ < >
106
+ { firstScreen . render ( ) }
107
+ { shouldRenderProvider . current && (
108
+ < BottomSheetModalProvider >
109
+ { state . routes . slice ( 1 ) . map ( ( route ) => {
110
+ const { options, navigation, render } = descriptors [ route . key ] ;
115
111
116
- return (
117
- < BottomSheetModalScreen
118
- key = { route . key }
119
- // Make sure index is in range, it could be out if snapToIndex is persisted
120
- // and snapPoints is changed.
121
- index = { Math . min (
122
- route . snapToIndex ?? index ?? 0 ,
123
- snapPoints . length - 1 ,
124
- ) }
125
- snapPoints = { snapPoints }
126
- navigation = { navigation }
127
- backgroundStyle = { [ themeBackgroundStyle , backgroundStyle ] }
128
- handleIndicatorStyle = { [
129
- themeHandleIndicatorStyle ,
112
+ const {
113
+ index,
114
+ backgroundStyle,
130
115
handleIndicatorStyle,
131
- ] }
132
- { ...sheetProps }
133
- >
134
- { render ( ) }
135
- </ BottomSheetModalScreen >
136
- ) ;
137
- } ) }
138
- </ BottomSheetModalProvider >
116
+ snapPoints = DEFAULT_SNAP_POINTS ,
117
+ ...sheetProps
118
+ } = options ;
119
+
120
+ return (
121
+ < BottomSheetModalScreen
122
+ key = { route . key }
123
+ // Make sure index is in range, it could be out if snapToIndex is persisted
124
+ // and snapPoints is changed.
125
+ index = { Math . min (
126
+ route . snapToIndex ?? index ?? 0 ,
127
+ snapPoints . length - 1 ,
128
+ ) }
129
+ snapPoints = { snapPoints }
130
+ navigation = { navigation }
131
+ backgroundStyle = { [ themeBackgroundStyle , backgroundStyle ] }
132
+ handleIndicatorStyle = { [
133
+ themeHandleIndicatorStyle ,
134
+ handleIndicatorStyle ,
135
+ ] }
136
+ { ...sheetProps }
137
+ >
138
+ { render ( ) }
139
+ </ BottomSheetModalScreen >
140
+ ) ;
141
+ } ) }
142
+ </ BottomSheetModalProvider >
143
+ ) }
144
+ </ >
139
145
) ;
140
146
}
0 commit comments