Bug report
Yes
Android only.
I think so.
Expo with v33 SDK
It should go to specified page or to the next.
On iOS device it is working fine, but on Android nothing happens.
https://snack.expo.io/SJxF4GwlB
Hi @kgorol,
Can you tell me if this works properly with version 3.7.5 of the plugin?
Thanks for replying @bd-arc,
Works like a charm on 3.7.5 :)
Still it's not working for me
setTimeout(() => this.carouselComponent.snapToNext(), 250)
adding timeout in the current version works for me :) less than 250 will not snap to next
setTimeout(() => this.carouselComponent.snapToNext(), 250)adding timeout in the current version works for me :) less than 250 will not snap to next
works for me! thanks :)
setTimeout(() => this.carouselComponent.snapToNext(), 250)
adding timeout in the current version works for me :) less than 250 will not snap to next
Works for me too! Thanks!
I think we shouldn't let this end here...
We have just one workaround, but nothing concrete yet.
Any update coming @bd-arc?
@Inovassist-dev I definitely agree that we need to get to the root of it.
The problem is that I need to know first and foremost if this is a bug introduced in 3.8.0 or something else. Hence my initial question.
But so far I've received contradictory answers...
Yeah, I understand...
Maybe I can help you! I'll check last versions in order to see if it's a problem in the latest one!
Hope this helps!
Have the same issue running on an iOS device: snapToItem(), snapToPrev(), and snapToNext() don't work.
I spent a long time trying to debug on 3.8.0 with no success, except for @calz10's workaround (which is suboptimal since it adds a noticeable delay).
@bd-arc, downgrading to 3.7.5 does not fix the problem for me. Also not after resetting all caches.
What else can I try? How can we get this to work again?
The problem is here.
When using snapToNext() or snapToPrev(), _snapToItem is triggered again with the old index
Also not working for me on versions 3.2 - 3.8, adding timeout does work, but the fix is far too slow and hacky to be used. Would like to know how this could be fixed as well.
@QQizi any thoughts on how to fix?
@QQizi @kgorol Actually got this to work by removing only iOS check for momentum bug fix here
Now click through and swipe work for me on Android.
@bd-arc I was using version at commit 85980e5177a75d393a1b38480800753282148c50 until today and did not have this problem.
I just updated to latest master version (commit 1aebb185036813b1104ea01fc6229b43f10f4d9c) and I am observing this problem. So yes, there is a regression between those two commits.
+1
I encounter the same problem on Android (not tested on IOS)
I am using react-native 0.60.5 and 3.8.1 (I also tried with 3.7.5 and it still didn't worked)
However, it was working with exactly the same code on react-native 0.59.4 and 3.7.5.
So it seems the upgrade of react-native version 0.59.4 to 0.60.5 could be linked.
@AlexandreMaistret Thank you for the helpful feedback!
Unfortunately your conclusion is the absolute worst case scenario... And I don't see anything that is supposed to affect ScrollView and FlatList in version 0.60's release notes...
@bd-arc I know it is quite a really bad scenario because I looked also the releases notes of 0.60.5and nothing seems to possibly interfere with thoses functions. I just tried again just now to be sure because I was also very surprised, and same situation : works on 0.59.4 and and not with 0.60.5 with exactly the same code and both 3.7.5.
The workaround with setTimeout works thought, but it is not usable since you can feel the delay and it feels really laggy then.
Just to give you more details on the code:
I am calling snapToNext() or snapToPrev() directly from the item with TouchableWithoutFeedback. The touchable event is called and go without any problem to snapToNext() function (I checked with logs) but then nothing, it does not go to the next item. Also it does not work with snapToItem() too. I tried with and without Debug JS activated, and also with JS Dev Mode off.
I didn't tried with iOS since I don't have a Mac.
In iOS 12.4.1 with React Native 0.60.5, 3.7.5 and 3.8.1 versions work fine, also in production. I will test with React Native 0.59.4 soon, but I think that will work well.
"react-native-snap-carousel": "^3.7.5",
"react-native": "0.61.2",
requestAnimationFrame(() => this.carouselRef.snapToPrev());
requestAnimationFrame(() => this.carouselRef.snapToNext());
Is a work around if you're sceptical when upgrading dependancies.
This workaround setTimeout(() => this.carousel.snapToPrev(), 0) is still needed in "react-native-snap-carousel": "^3.8.2", :(
setTimeout(() => this.carouselComponent.snapToNext(), 250)adding timeout in the current version works for me :) less than 250 will not snap to next
You just saved the day. I almost forgot about this javascript context trick that is very usefull sometimes... thank you!
The only workaround that works for me is enabling momentum by setting props enableMomentum.
I suspect that without this props, the _activeItem is not updated when calling snapToNext/snapToPrev.
This solution
setTimeout(() => this._carousel.snapToNext(), 0)
and this one
requestAnimationFrame(() => this._carousel.snapToPrev())
work for me, however the animation disappears in both cases (only on android).
Any hint for this problem?
This solution
setTimeout(() => this._carousel.snapToNext(), 0)
and this one
requestAnimationFrame(() => this._carousel.snapToPrev())
work for me, however the animation disappears in both cases (only on android).
Any hint for this problem?
The same, the animation disappears in both cases (only on android).
I'm facing the exact same problem with @valeriik and @carmenchapa. I tried to use enableMomentum, but it makes the animation on Android looks a bit weird
@9600baud this thread documents the issue we are seeing on android.
Just for a little further information (on the most recent 3.8.4 version):
snapToNext() works if used outside of the carousel like this:
<Fragment>
<Carousel
ref={(c) => { this.carousel = c }}
data={data}
...
/>
<TouchableOpacity
style={{ backgroundColor: 'lime', position: 'absolute', bottom: 24, width: '90%', height: 42 }}
onPress={this.carousel.snapToNext} />
</Fragment>
But if you call this.carousel.snapToNext() from a carousel item it does not work (and must use the workarounds mentioned by others on this thread):
renderCarouselItem = ({ item, index }) => {
return <SectionInput
saveSection={() => { this.carousel.snapToNext(); this.saveSection() }}
index={index}
section={item}/>
}
Update: Pull Request #648 fixes this! Are there any maintainers (@bd-arc maybe?) that can take a look to get this fix out?
It appears that the issue was, when triggering the snapToNext() or snapToPrev() based on a button inside the carousel, the touch event was being seen the same as a touch & drag event, which triggered the snapToItem() function. The PR mentioned above differentiates the two, which fixes our problem
@bfaulk96 Thanks for the info!
I plan on releasing an update very soon that should enhance the carousel from a "feeling" standpoint. I'll make sure to merge the PR you mentioned beforehand.
On android animation disappear
v 3.8.4
PR merged and published in version 3.9.0. Let me know if this finally solves the issue!
Just realized there was a potential issue with the PR.
Given the fact that ScrollView's scrollTo() method doesn't accept a callback or a duration, this line won't be executed at the proper time if the scroll is animated...
I think I have the same issue. I just tried the following code:
this.setState(
{
screens: newScreens,
},
() => {
setTimeout(() => this.carousel.snapToNext(), 500);
},
);
It updates the state by updating one or more screens to the current screens and afterwards snaps to the next. It ends up at the correct screen, unfortunately _mostly_ without an animation. _Sometimes_ it animates.
Version 3.9.0.
When using snapToItem(), the first time the callback onSnapToItem() is not being called. However the _snapToItem is getting called twice, once with the old index.
This issue persist even in "react-native-snap-carousel": "^3.8.4".
The timeout solution works fine but is there a better way?
I have the same issue, I have to use a setTimeout with snapToItem
setTimeout(() => this._carousel.snapToItem(this.state.currentIndex, true, fireCallback),250)

As you can see, the selected item is 85, but the snapToItem have the old one the 88. If I use a setTimeout it works, but does not look very elegant.
Did anyone found a solution for the animation which disappears on Android?
脡 uma pena que uma lib t茫o boa esteja abandonada! At茅 agora nada de solu莽玫es :(
Most helpful comment
adding timeout in the current version works for me :) less than 250 will not snap to next