Expo UI and Router for iOSExpo SDK 57 and later, iOS only
Modifiers

scrollPosition

Binds the leading scroll target of a scrollable container to an observable native state.

scrollPosition(state, options)

iOS 17+
ParameterTypeDescription
stateObservableState<string | null>An ObservableState<string | null> created with useNativeState.
options(optional){ anchor: UnitPointValue, onChange: (id: string | null) => void }-

Binds the leading scroll target of a scrollable container to an observable native state.

Reading state.value returns the id of the leading scroll target.

  • Writing to it scrolls the container to the matching view.
  • Pair with scrollTargetLayout() on the content container and id() on each target.
  • Works on ScrollView, LazyVStack, LazyHStack, and other scrollable containers.

On iOS below 17.0, the modifier is a no-op.

Returns: ModifierConfig

See: Official SwiftUI documentation.

Example

const activeID = useNativeState<string | null>(null);

<ScrollView
  modifiers={[
    scrollPosition(activeID, {
      anchor: 'center',
      onChange: (newID) => console.log('leading target:', newID),
    }),
  ]}>
  <VStack modifiers={[scrollTargetLayout()]}>
    {items.map((item) => (
      <Text key={item.id} modifiers={[id(item.id)]}>{item.text}</Text>
    ))}
  </VStack>
</ScrollView>

Works with

scrollPosition is made for these components. On other components it has no effect.

Sources

The original Expo docs for this page:

On this page