useBiometric() returned a fresh object every render. The hub screen's useFocusEffect depended on that object, so react-navigation re-ran the focus callback on every render, calling refetch() and biometric.refresh() in an infinite loop.
- Memoize useBiometric's return value with useMemo so its reference is stable across renders when state is unchanged.
- Depend on the specific refresh function in the hub screen's useFocusEffect instead of the whole biometric object.
- Add a test proving useBiometric returns a stable reference.