Skip to content

Commit 2e69ee7

Browse files
authored
refactor: remove auto bottom inset on scrollables (#784)
* refactor: remove auto bottom inset on scrollables Scrollables no longer get the bottom safe-area inset applied natively. Only keyboard handling stays automatic — apply the inset in JS instead. Also drops manual scroll indicator insets on iOS; UIKit derives them from the content inset. * refactor: rename pinned scroll view to detected v3 literally pinned the scroll view's frame to the container. v4 lets Yoga own every frame — we only detect it and wire keyboard handling. * docs: add changelog entry for #784 * fix(web): don't lift detected scrollables above the bottom safe area Mirrors native — scroll content runs edge-to-edge behind the home indicator and user-applied content padding owns the inset. Avoids double padding when following the v4 migration advice. * fix(ios): drop keyboard content inset — the sheet already avoids the keyboard UIKit keeps the sheet above the keyboard and v4 rebounds the container to the sheet's visible size, so the viewport is never behind it. The v3-era keyboardHeight inset double-compensated, leaving a huge gap at the bottom of scroll content while typing. Caret auto-scroll now extends its target past an absolute footer instead. * fix(ios): apply keyboard inset only when content overflows the viewport Restores the keyboard-height content inset — content that already fits above the keyboard has nothing to reveal, so the inset only opened blank scroll range below it (huge gap at the bottom). Re-synced while typing since a growing multiline input can cross the threshold. * fix: keyboard inset stops at the keyboard edge for absolute footers The inset also lifted content above a floating footer, doubling the clearance the user's content padding already provides. Footer clearance now belongs to the padding alone; the caret reveal extends its target past the footer instead. * chore(example): fix PromptSheet FOOTER_HEIGHT
1 parent e13a5fc commit 2e69ee7

19 files changed

Lines changed: 194 additions & 161 deletions

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
- The footer now lays out relative by default — it takes up space below the content, is included in the `auto` detent height (excluded from `peek`), and stays behind the keyboard. Set `footerOptions.position` to `'absolute'` to restore the previous floating behavior (`keyboardOffset` only applies there). ([#748](https://github.com/lodev09/react-native-true-sheet/pull/748), [#754](https://github.com/lodev09/react-native-true-sheet/pull/754) by [@lodev09](https://github.com/lodev09))
2020
- Content now wraps its children's height by default instead of filling the sheet — like a regular view. Pass `flex: 1` via `style` to fill. ([#746](https://github.com/lodev09/react-native-true-sheet/pull/746) by [@lodev09](https://github.com/lodev09))
2121
- The container is now sized to the sheet's visible height per detent and tracks it in realtime while dragging, on all platforms. The `scrollable` prop is removed — scrollables are auto-detected. Requires React Native 0.82+. ([#735](https://github.com/lodev09/react-native-true-sheet/pull/735) by [@lodev09](https://github.com/lodev09))
22+
- Scrollables no longer get the bottom safe-area inset applied natively — only keyboard handling stays automatic. Pad the scroll content yourself via `contentContainerStyle` (or `contentInsetAdjustmentBehavior` on iOS). ([#784](https://github.com/lodev09/react-native-true-sheet/pull/784) by [@lodev09](https://github.com/lodev09))
2223
- The sheet navigator is now built on `standard-navigation` with first-class Expo Router support — import the ready-made `Sheet` layout from the new `/navigation/expo-router` entry point instead of wrapping with `withLayoutContext`. Requires the new `standard-navigation` peer dependency; React Navigation apps also need `@react-navigation/native` 7.3+ (same API otherwise, plus a new `createTrueSheetScreen` for the static API). ([#772](https://github.com/lodev09/react-native-true-sheet/pull/772) by [@lodev09](https://github.com/lodev09))
2324

2425
### 💡 Others

‎android/src/main/java/com/lodev09/truesheet/TrueSheetContainerView.kt‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
6161
return bottom
6262
}
6363

64-
var insetAdjustment: TrueSheetInsetAdjustment = TrueSheetInsetAdjustment.AUTOMATIC
65-
var scrollViewBottomInset: Int = 0
6664
var absoluteFooter: Boolean = false
6765

6866
/**
@@ -96,8 +94,7 @@ class TrueSheetContainerView(reactContext: ThemedReactContext) :
9694
}
9795

9896
fun setupScrollable() {
99-
val bottomInset = if (insetAdjustment == TrueSheetInsetAdjustment.AUTOMATIC) scrollViewBottomInset else 0
100-
contentView?.setupScrollable(bottomInset)
97+
contentView?.setupScrollable()
10198
}
10299

103100
fun setupKeyboardHandler() {

‎android/src/main/java/com/lodev09/truesheet/TrueSheetContentView.kt‎

Lines changed: 41 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ interface TrueSheetContentViewDelegate {
3232

3333
/**
3434
* Keyboard occlusion adjustment below the content — positive for an absolute
35-
* footer risen above the keyboard covering the content's bottom edge,
36-
* negative for a relative footer sitting behind the keyboard shielding it.
35+
* footer floating over the viewport's bottom edge (extends the caret reveal),
36+
* negative for a relative footer sitting behind the keyboard shielding that
37+
* much of its overlap (reduces the keyboard padding).
3738
*/
3839
val footerKeyboardOcclusion: Int
3940
}
@@ -47,9 +48,8 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
4748
var delegate: TrueSheetContentViewDelegate? = null
4849
var stateWrapper: StateWrapper? = null
4950

50-
private var pinnedScrollView: ViewGroup? = null
51+
private var detectedScrollView: ViewGroup? = null
5152
private var originalScrollViewPaddingBottom: Int = 0
52-
private var bottomInset: Int = 0
5353
private var scrollableBounded = false
5454

5555
/**
@@ -84,14 +84,14 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
8484

8585
/**
8686
* Whether the sheet has an `auto` detent. Deriving the sheet height from the
87-
* scroll content is circular with natural layout, so the pinned ScrollView's
87+
* scroll content is circular with natural layout, so the detected ScrollView's
8888
* viewport is force-bounded to the container only in this case.
8989
*/
9090
var hasAutoDetent = false
9191
set(value) {
9292
if (field == value) return
9393
field = value
94-
if (pinnedScrollView != null) {
94+
if (detectedScrollView != null) {
9595
setScrollableBounded(value)
9696
}
9797
}
@@ -107,14 +107,14 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
107107
}
108108

109109
private fun checkScrollViewChanged() {
110-
if (pinnedScrollView == null || pinnedScrollView?.isDescendantOf(this) == false) {
110+
if (detectedScrollView == null || detectedScrollView?.isDescendantOf(this) == false) {
111111
delegate?.contentViewScrollViewDidChange()
112112
}
113113
}
114114

115115
/**
116116
* Tells the shadow node to fill the container (flexGrow/flexShrink) so the
117-
* pinned ScrollView's viewport is bounded to the visible space. Only applied
117+
* detected ScrollView's viewport is bounded to the visible space. Only applied
118118
* for auto detents — otherwise content lays out naturally like a regular view.
119119
*/
120120
private fun setScrollableBounded(bounded: Boolean) {
@@ -128,39 +128,31 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
128128
}
129129
}
130130

131-
fun setupScrollable(bottomInset: Int) {
132-
// Check if pinned scroll view is still valid (still in view hierarchy)
133-
if (pinnedScrollView != null && pinnedScrollView?.isDescendantOf(this) == false) {
131+
fun setupScrollable() {
132+
// Check if the detected scroll view is still valid (still in view hierarchy)
133+
if (detectedScrollView != null && detectedScrollView?.isDescendantOf(this) == false) {
134134
clearScrollable()
135135
}
136136

137-
// Already set up with same inset and valid scroll view
138-
if (pinnedScrollView != null && this.bottomInset == bottomInset) {
137+
if (detectedScrollView != null) {
139138
return
140139
}
141140

142141
val scrollView = findScrollView(this) ?: return
143142

144-
// Only capture originals on first pin
145-
if (pinnedScrollView == null) {
146-
originalScrollViewPaddingBottom = scrollView.paddingBottom
147-
pinnedScrollView = scrollView
143+
originalScrollViewPaddingBottom = scrollView.paddingBottom
144+
detectedScrollView = scrollView
148145

149-
scrollView.isNestedScrollingEnabled = true
150-
(scrollView.parent as? SwipeRefreshLayout)?.isNestedScrollingEnabled = false
146+
scrollView.isNestedScrollingEnabled = true
147+
(scrollView.parent as? SwipeRefreshLayout)?.isNestedScrollingEnabled = false
151148

152-
scrollView.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
153-
if (scrollY != oldScrollY) {
154-
delegate?.contentViewDidScroll()
155-
}
149+
scrollView.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
150+
if (scrollY != oldScrollY) {
151+
delegate?.contentViewDidScroll()
156152
}
157-
158-
setScrollableBounded(hasAutoDetent)
159153
}
160154

161-
this.bottomInset = bottomInset
162-
163-
setScrollViewPaddingBottom(originalScrollViewPaddingBottom + bottomInset)
155+
setScrollableBounded(hasAutoDetent)
164156

165157
// If keyboard is currently showing, re-apply the keyboard inset to the new ScrollView
166158
val keyboardHeight = keyboardObserver?.currentHeight ?: 0
@@ -170,7 +162,7 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
170162
}
171163

172164
private fun setScrollViewPaddingBottom(paddingBottom: Int) {
173-
val scrollView = pinnedScrollView ?: return
165+
val scrollView = detectedScrollView ?: return
174166
scrollView.clipToPadding = false
175167
scrollView.setPadding(
176168
scrollView.paddingLeft,
@@ -181,18 +173,17 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
181173
}
182174

183175
fun clearScrollable() {
184-
pinnedScrollView?.setOnScrollChangeListener(null as View.OnScrollChangeListener?)
185-
pinnedScrollView?.isNestedScrollingEnabled = false
186-
(pinnedScrollView?.parent as? SwipeRefreshLayout)?.isNestedScrollingEnabled = true
176+
detectedScrollView?.setOnScrollChangeListener(null as View.OnScrollChangeListener?)
177+
detectedScrollView?.isNestedScrollingEnabled = false
178+
(detectedScrollView?.parent as? SwipeRefreshLayout)?.isNestedScrollingEnabled = true
187179
setScrollViewPaddingBottom(originalScrollViewPaddingBottom)
188180
setScrollableBounded(false)
189-
pinnedScrollView = null
181+
detectedScrollView = null
190182
originalScrollViewPaddingBottom = 0
191-
bottomInset = 0
192183
}
193184

194185
fun findScrollView(): ViewGroup? {
195-
if (pinnedScrollView != null) return pinnedScrollView
186+
if (detectedScrollView != null) return detectedScrollView
196187
return findScrollView(this as View)
197188
}
198189

@@ -276,30 +267,30 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
276267
}
277268

278269
private fun updateScrollViewInsetForKeyboard(keyboardHeight: Int) {
279-
val scrollView = pinnedScrollView ?: return
270+
val scrollView = detectedScrollView ?: return
280271

281-
// An absolute footer rises above the keyboard and covers the content's
282-
// bottom edge — include it so the caret clears the footer, not just the
283-
// keyboard. A relative footer stays behind the keyboard below the content,
284-
// so its height shields that much of the keyboard's overlap.
272+
// A relative footer stays behind the keyboard below the content, so its
273+
// height shields that much of the keyboard's overlap. An absolute footer
274+
// floats within the viewport — its clearance is the content padding's job
275+
// (the caret reveal accounts for it, see scrollToFocusedInput).
285276
val totalBottomInset = if (keyboardHeight > 0) {
286-
maxOf(0, keyboardHeight + (delegate?.footerKeyboardOcclusion ?: 0))
277+
maxOf(0, keyboardHeight + minOf(0, delegate?.footerKeyboardOcclusion ?: 0))
287278
} else {
288-
bottomInset
279+
0
289280
}
290281
setScrollViewPaddingBottom(originalScrollViewPaddingBottom + totalBottomInset)
291282

292283
scrollView.post { nudgeScrollView() }
293284
}
294285

295286
private fun nudgeScrollView() {
296-
val scrollView = pinnedScrollView ?: return
287+
val scrollView = detectedScrollView ?: return
297288
scrollView.smoothScrollBy(0, 1)
298289
scrollView.smoothScrollBy(0, -1)
299290
}
300291

301292
private fun scrollToFocusedInput() {
302-
val scrollView = pinnedScrollView ?: findScrollView() ?: return
293+
val scrollView = detectedScrollView ?: findScrollView() ?: return
303294
val focusedView = findFocus() ?: return
304295

305296
val focusedLocation = IntArray(2)
@@ -326,14 +317,18 @@ class TrueSheetContentView(private val reactContext: ThemedReactContext) : React
326317
caretBottom = viewTop + focusedView.height
327318
}
328319

320+
// An absolute footer floats over the viewport's bottom edge — extend the
321+
// caret target so it clears the footer, not just the keyboard.
322+
val footerOcclusion = maxOf(0, delegate?.footerKeyboardOcclusion ?: 0)
323+
329324
val offset = keyboardScrollOffset.toInt()
330325
val visibleHeight = scrollView.height - scrollView.paddingBottom
331326
val visibleTop = scrollView.scrollY
332327
val visibleBottom = scrollView.scrollY + visibleHeight
333328

334329
when {
335-
caretBottom + offset > visibleBottom ->
336-
scrollView.smoothScrollTo(0, caretBottom + offset - visibleHeight)
330+
caretBottom + offset + footerOcclusion > visibleBottom ->
331+
scrollView.smoothScrollTo(0, caretBottom + offset + footerOcclusion - visibleHeight)
337332

338333
caretTop - offset < visibleTop ->
339334
scrollView.smoothScrollTo(0, (caretTop - offset).coerceAtLeast(0))

‎android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,6 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
319319

320320
private fun setupScrollable() {
321321
viewController.containerView?.let {
322-
it.insetAdjustment = viewController.insetAdjustment
323-
it.scrollViewBottomInset = viewController.contentBottomInset
324322
it.scrollableOptions = viewController.scrollableOptions
325323
it.hasAutoDetent = viewController.detents.contains(-1.0)
326324
it.footerBottomInset = viewController.contentBottomInset
@@ -643,7 +641,7 @@ class TrueSheetView(private val reactContext: ThemedReactContext) :
643641
viewController.commitKeyboardDetent()
644642
}
645643

646-
// When the ScrollView changes (e.g. conditional remount), re-pin the new ScrollView
644+
// When the ScrollView changes (e.g. conditional remount), re-detect the new ScrollView
647645
// and request layout so BottomSheetBehavior re-discovers the nested scrolling child.
648646
override fun containerViewScrollViewDidChange() {
649647
setupScrollable()

‎android/src/main/java/com/lodev09/truesheet/core/TrueSheetCoordinatorLayout.kt‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class TrueSheetCoordinatorLayout(context: Context) :
5757
private var streamGestureClaimed = false
5858

5959
// Whether the sheet owns vertical drags for this stream: the touch target is inside
60-
// the sheet but outside the pinned scrollable (e.g. a header overlaying it), with
60+
// the sheet but outside the detected scrollable (e.g. a header overlaying it), with
6161
// nothing vertically scrollable along its chain. Such targets consume the stream
6262
// natively (no nested scroll), and BottomSheetBehavior won't intercept because the
6363
// scrollable's bounds still contain the point (touchingScrollingChild) — intercept
@@ -127,7 +127,7 @@ class TrueSheetCoordinatorLayout(context: Context) :
127127

128128
/**
129129
* Resolves the stream's touch target (respecting zIndex and pointerEvents) and
130-
* decides whether the sheet may drag from it — inside the sheet, outside the pinned
130+
* decides whether the sheet may drag from it — inside the sheet, outside the detected
131131
* scrollable, and nothing along the target's chain scrolls vertically.
132132
*/
133133
private fun updateStreamTargetFlags(ev: MotionEvent) {
@@ -139,7 +139,7 @@ class TrueSheetCoordinatorLayout(context: Context) :
139139
.firstNotNullOfOrNull { it.getView() } ?: return
140140
if (target !== sheet && !target.isDescendantOf(sheet)) return
141141

142-
// A pinned scrollable that can scroll (or hosts pull-to-refresh) owns its
142+
// A detected scrollable that can scroll (or hosts pull-to-refresh) owns its
143143
// touches — nested scrolling drags the sheet. When it can't scroll (e.g.
144144
// the sheet is fully expanded and the content fits) it eats the gesture
145145
// instead, so fall through and let the sheet drag from it — an EditText

‎common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewShadowNode.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ void TrueSheetContentViewShadowNode::adjustLayoutWithState() {
2525

2626
auto &props = getConcreteProps();
2727

28-
// When a ScrollView is pinned under an auto detent, fill the container so
28+
// When a ScrollView is detected under an auto detent, fill the container so
2929
// descendant flex layouts (flex:1 wrappers, the ScrollView itself) resolve
3030
// against a definite height and the viewport is bounded — natural layout is
3131
// circular there since the sheet height derives from the content's natural

‎common/cpp/react/renderer/components/TrueSheetSpec/TrueSheetContentViewState.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace facebook::react {
1212

1313
/*
1414
* State for <TrueSheetContentView> component.
15-
* `scrollableBounded` is set from native when a ScrollView is pinned so the
15+
* `scrollableBounded` is set from native when a ScrollView is detected so the
1616
* shadow node bounds the content to the container via flexShrink.
1717
* `naturalHeight` is measured by the shadow node during layout — the height
1818
* the content wants when unbounded (see TrueSheetContentViewShadowNode).

‎docs/docs/guides/scrolling.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Scrolling content within the sheet works like a regular view — bound the scrol
1212

1313
## How?
1414

15-
Scroll views (including `ScrollView` and `FlatList`) are **automatically detected**. Insets, keyboard handling, and nested scrolling are all wired for you — no props needed.
15+
Scroll views (including `ScrollView` and `FlatList`) are **automatically detected**. Keyboard handling and nested scrolling are wired for you — no props needed.
1616

1717
Like any scroll view in React Native, it needs a bounded height to scroll. Pass `flex: 1` via the sheet's [`style`](../reference/configuration#style) prop so the content fills the sheet's visible height per detent — resizing in realtime while dragging:
1818

‎docs/docs/migration.mdx‎

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,33 @@ const MyFooter = () => {
124124
See the [Footer guide](guides/footer#safe-area-handling) for more details.
125125
:::
126126

127-
### 6. Sheet Navigator Requires `@react-navigation/native` 7.3+
127+
### 6. Scrollables No Longer Auto-Inset
128+
129+
A plugged scrollable no longer gets the bottom safe-area inset applied natively. Only keyboard handling stays automatic. Pad the scroll content yourself:
130+
131+
```tsx
132+
// ❌ v3 — the inset was applied natively
133+
<ScrollView>{/* ... */}</ScrollView>
134+
135+
// ✅ v4 — pad the content yourself
136+
const insets = useSafeAreaInsets();
137+
138+
<ScrollView contentContainerStyle={{ paddingBottom: insets.bottom }}>
139+
{/* ... */}
140+
</ScrollView>
141+
```
142+
143+
On iOS, you can let UIKit apply it instead with React Native's [`contentInsetAdjustmentBehavior`](https://reactnative.dev/docs/scrollview#contentinsetadjustmentbehavior-ios) (iOS only, defaults to `"never"`):
144+
145+
```tsx
146+
<ScrollView contentInsetAdjustmentBehavior="automatic">{/* ... */}</ScrollView>
147+
```
148+
149+
:::info
150+
If your sheet has a footer, it already absorbs the bottom inset (see above) — pad for the footer's height instead of the safe area.
151+
:::
152+
153+
### 7. Sheet Navigator Requires `@react-navigation/native` 7.3+
128154

129155
The navigator is now built on [`standard-navigation`](https://github.com/react-navigation/standard-navigation), so one implementation works with both React Navigation and Expo Router. For React Navigation apps, the `/navigation` entry point now requires `@react-navigation/native` version `7.3.0` or higher (previously `@react-navigation/core`), plus the new `standard-navigation` peer dependency:
130156

@@ -134,7 +160,7 @@ yarn add @react-navigation/native@^7.3.0 standard-navigation
134160

135161
Your navigator code is unchanged — `createTrueSheetNavigator`, `useTrueSheetNavigation`, screen options, `navigation.resize()`, and listeners all keep the same API.
136162

137-
### 7. Expo Router Uses the New `/navigation/expo-router` Entry Point
163+
### 8. Expo Router Uses the New `/navigation/expo-router` Entry Point
138164

139165
The `withLayoutContext` recipe is replaced by a ready-to-use `Sheet` layout. Requires Expo SDK 57+ and the new `standard-navigation` peer dependency — no `@react-navigation/*` install needed.
140166

@@ -251,6 +277,7 @@ const Sheet = createTrueSheetNavigator({
251277
- Add `style={{ flex: 1 }}` where content should fill the sheet (bounded scroll views, spacer layouts)
252278
- Add `footerOptions={{ position: 'absolute' }}` to keep a floating footer
253279
- Remove manual safe-area padding from footers
280+
- Add bottom safe-area padding to scrollables — it's no longer applied natively
254281
- If using the Sheet Navigator, install `standard-navigation` and update `@react-navigation/native` to 7.3+
255282
- If using Expo Router, install `standard-navigation`, replace the `withLayoutContext` wrapper with the `Sheet` layout from `/navigation/expo-router`, and update `useTrueSheetNavigation` imports
256283
6. **Test your app:**

‎example/shared/src/components/sheets/FlatListSheet.tsx‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { forwardRef, useRef, useState } from 'react';
2-
import { StyleSheet, FlatList, View, Platform } from 'react-native';
2+
import { StyleSheet, FlatList, Platform } from 'react-native';
33
import { TrueSheet, type TrueSheetProps } from '@lodev09/react-native-true-sheet';
4+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
45

56
import { DARK, DARK_GRAY, FOOTER_HEIGHT, HEADER_HEIGHT, SPACING, times } from '../../utils';
67
import { DemoContent } from '../DemoContent';
@@ -16,6 +17,7 @@ export const FlatListSheet = forwardRef<TrueSheet, FlatListSheetProps>((props, r
1617
const testRef = useRef<TrueSheet>(null);
1718
const scrollRef = useRef<FlatList>(null);
1819
const [itemCount, setItemCount] = useState(3);
20+
const insets = useSafeAreaInsets();
1921

2022
return (
2123
<TrueSheet
@@ -39,7 +41,10 @@ export const FlatListSheet = forwardRef<TrueSheet, FlatListSheetProps>((props, r
3941
<FlatList
4042
ref={scrollRef}
4143
data={times(itemCount, (i) => i)}
42-
contentContainerStyle={styles.content}
44+
contentContainerStyle={[
45+
styles.content,
46+
{ paddingBottom: FOOTER_HEIGHT + SPACING + insets.bottom },
47+
]}
4348
indicatorStyle="black"
4449
ItemSeparatorComponent={Spacer}
4550
renderItem={({ item }) => <DemoContent color={DARK_GRAY} text={`Item #${item}`} />}
@@ -75,6 +80,5 @@ const styles = StyleSheet.create({
7580
content: {
7681
padding: SPACING,
7782
paddingTop: HEADER_HEIGHT + SPACING,
78-
paddingBottom: FOOTER_HEIGHT + SPACING,
7983
},
8084
});

0 commit comments

Comments
 (0)