0
0
React Nativemobile~20 mins

Infinite scrolling (onEndReached) in React Native - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Infinite Scrolling Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
ui_behavior
intermediate
2:00remaining
What happens when onEndReached triggers in this FlatList?
Consider this React Native FlatList component with an onEndReached handler that fetches more items. What will the user see after scrolling to the bottom once?
React Native
import React, { useState } from 'react';
import { FlatList, Text, View } from 'react-native';

export default function App() {
  const [items, setItems] = useState(Array.from({ length: 20 }, (_, i) => i + 1));

  const loadMore = () => {
    const newItems = Array.from({ length: 10 }, (_, i) => items.length + i + 1);
    setItems([...items, ...newItems]);
  };

  return (
    <FlatList
      data={items}
      keyExtractor={item => item.toString()}
      renderItem={({ item }) => <Text>{`Item ${item}`}</Text>}
      onEndReached={loadMore}
      onEndReachedThreshold={0.5}
    />
  );
}
ANothing happens because onEndReached is not called automatically.
BThe list will reset and show only the first 10 items again.
CThe list will add 10 more items at the bottom, so the user can scroll further down.
DThe list will crash because setItems is called inside onEndReached.
Attempts:
2 left
💡 Hint
Think about what the loadMore function does when called.
lifecycle
intermediate
2:00remaining
Why might onEndReached fire multiple times rapidly in this example?
Look at this FlatList with onEndReached calling fetchMore. Why could the fetchMore function be called many times quickly when scrolling to the bottom?
React Native
import React, { useState } from 'react';
import { FlatList, Text } from 'react-native';

export default function App() {
  const [data, setData] = useState(Array.from({ length: 15 }, (_, i) => i + 1));

  const fetchMore = () => {
    const more = Array.from({ length: 5 }, (_, i) => data.length + i + 1);
    setData([...data, ...more]);
  };

  return (
    <FlatList
      data={data}
      keyExtractor={item => item.toString()}
      renderItem={({ item }) => <Text>{`Item ${item}`}</Text>}
      onEndReached={fetchMore}
      onEndReachedThreshold={0.1}
    />
  );
}
ABecause onEndReachedThreshold is set too high, so it never triggers.
BBecause onEndReached triggers every time the user scrolls near the bottom, and fetchMore updates state causing re-render, triggering onEndReached again immediately.
CBecause fetchMore is asynchronous and React Native queues multiple calls automatically.
DBecause FlatList requires a debounce function to work properly.
Attempts:
2 left
💡 Hint
Think about what happens when state updates inside onEndReached.
🔧 Debug
advanced
2:00remaining
What error occurs with this onEndReached handler?
This FlatList's onEndReached handler tries to fetch more data but causes an error. What error will this code produce?
React Native
import React, { useState } from 'react';
import { FlatList, Text } from 'react-native';

export default function App() {
  const [items, setItems] = useState([1, 2, 3]);

  const loadMore = () => {
    setItems(items.push(items.length + 1));
  };

  return (
    <FlatList
      data={items}
      keyExtractor={item => item.toString()}
      renderItem={({ item }) => <Text>{`Item ${item}`}</Text>}
      onEndReached={loadMore}
      onEndReachedThreshold={0.5}
    />
  );
}
ATypeError: setItems is called with a number instead of an array.
BSyntaxError: Missing parentheses in function call.
CRuntimeError: Infinite loop detected in onEndReached.
DNo error, the list updates correctly.
Attempts:
2 left
💡 Hint
Check what Array.push returns and what setItems expects.
🧠 Conceptual
advanced
2:00remaining
Which option best prevents multiple onEndReached calls during loading?
You want to avoid multiple fetches while loading more data in onEndReached. Which approach below correctly prevents multiple calls?
AUse a global variable outside the component to track calls.
BCall fetchMore inside a setTimeout with 0 delay to delay execution.
CRemove onEndReachedThreshold so onEndReached triggers only once.
DUse a loading state boolean to skip fetchMore if already loading, setting loading true before fetch and false after.
Attempts:
2 left
💡 Hint
Think about how to track if a fetch is in progress inside the component.
navigation
expert
2:00remaining
What is the best way to reset FlatList scroll position after loading new data?
After loading more items in onEndReached, you want to reset the FlatList scroll to the top. Which method correctly achieves this?
React Native
import React, { useState, useRef } from 'react';
import { FlatList, Text, Button } from 'react-native';

export default function App() {
  const [data, setData] = useState(Array.from({ length: 20 }, (_, i) => i + 1));
  const listRef = useRef(null);

  const loadMore = () => {
    const more = Array.from({ length: 10 }, (_, i) => data.length + i + 1);
    setData([...data, ...more]);
    // Reset scroll here
  };

  return (
    <>
      <Button title="Load More and Scroll Top" onPress={loadMore} />
      <FlatList
        ref={listRef}
        data={data}
        keyExtractor={item => item.toString()}
        renderItem={({ item }) => <Text>{`Item ${item}`}</Text>}
      />
    </>
  );
}
ACall listRef.current.scrollToOffset({ offset: 0, animated: true }) right after setData in loadMore.
BCall listRef.current.scrollToIndex({ index: 0 }) before setData in loadMore.
CCall listRef.current.scrollToEnd() after setData in loadMore.
DUse FlatList's initialScrollIndex prop to 0 and update it after loading.
Attempts:
2 left
💡 Hint
Think about how to scroll programmatically after state updates.