#android #react-native #react-native-android #react-native-flatlist
#Android #реагировать-родной #react-native-android #реагировать-родной-flatlist
Вопрос:
Я реализую слайдер, используя FlatList — React Native,
У меня есть два случая
- нажмите, чтобы перейти к следующему слайду
- нажмите, чтобы пропустить и перейти к последнему элементу в слайдере
итак, сначала я должен знать текущий индекс, в котором я нахожусь, и на его основе я перехожу к следующему элементу,
и чтобы получить этот индекс, я должен использовать onMomentumScrollEnd
, но проблема в том, что он не запускается в Android
onMomentumScrollEnd={(ev) => {
offsetRef.current = ev.nativeEvent.contentOffset.x;
console.log('ev', ev.nativeEvent.contentOffset.x);
console.log(' offsetRef.current', offsetRef.current);
}}
const NextButton = () => {
return (
<TouchableOpacity
onPress={() =>
flatListRef.current.scrollToOffset({
animated: true,
offset: offset.current width,
})
}>
<Text style={{color: '#fff', fontSize: 16}}>Next</Text>
</TouchableOpacity>
);
};
const _renderSkipButton = () => {
return (
<AnimatedButton
onPress={() => {
// animation();
// setDoneBtn((prev) => !prev);
flatListRef.current.scrollToIndex({
animated: true,
index: data.length - 1, // Not work!
});
}}
style={[styles.buttonCircle, {transform: [{translateY: skipButton}]}]}>
<Text>skip</Text>
</AnimatedButton>
);
};
<Animated.FlatList
data={data.reverse()}
keyExtractor={(item) => item.title}
horizontal
ref={flatListRef}
showsHorizontalScrollIndicator={false}
pagingEnabled
scrollEventThrottle={16}
contentContainerStyle={{
paddingBottom: 100,
flexDirection: 'row-reverse',
}}
onScroll={Animated.event(
[{nativeEvent: {contentOffset: {x: scrollX}}}],
{useNativeDriver: false},
)}
onMomentumScrollEnd={(ev) => {
const index = Math.round(ev.nativeEvent.contentOffset.x / ITEM_WIDTH);
const newIndex = I18nManager.isRTL ? data.length - index - 1 : index;
indexItem.current = newIndex;
console.log('onMomentumScrollEnd', newIndex);
}}
renderItem={....}
/>
Комментарии:
1. Почему вы используете смещение для предыдущего / следующего и индекс для пропуска?
2. @J.Doe для пропуска я перехожу к последнему индексу, который будет работать (я собираюсь индексировать 0), потому что мое приложение RTL, для следующего предыдущего я просто пытаюсь индексировать и смещать, но ничего не работает, как ожидалось!
Ответ №1:
onMomentumScrollEnd вызывается, когда вы проводите пальцем, я думаю, вам нужно управлять этим вручную.
Комментарии:
1. Не совсем, приведенный выше код хорошо работает в iOS, я думаю, это ошибка, в следующей кнопке я прокручиваю до смещения, основанного на текущем смещении FlatList, но поскольку
onMomentumScrollEnd
он не сработал, я не смог получить новое смещение, и поэтому следующая кнопка не работает и застряла на втором слайде 🙂