react-navigation / react-navigation/react-navigation
Custom Component with <PanGestureHandler/> not work when used in React Navigation
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- TypeScript
- Sterne
- 24.5k
- Forks
- 5.1k
- Ø Merge
- 1 T. 5 Std.
- Gemergte PRs (30 T.)
- 18
Beschreibung
Current Behavior
I'm trying to create a modal component with of gesture handler,
Here's my CustomComponent.js:
import React from 'react';
import {View, Dimensions, Text, TouchableOpacity, Animated, TextInput, Modal, FlatList} from 'react-native';
import {PanGestureHandler, gestureHandlerRootHOC, State} from 'react-native-gesture-handler';
const {width, height} = Dimensions.get('window');
export default class CustomComponent extends React.Component {
constructor(props) {
console.log('prop', props);
super(props);
this.state = {
translateY: new Animated.Value(0),
isModalOpen: false
};
}
openModal() {
this.setState({isModalOpen: true});
}
closeModal() {
this.setState({isModalOpen: false});
}
handleGesture = (e) => {
this.state.translateY.setValue(e.nativeEvent.translationY);
};
handlerChange = (e) => {
if (e.nativeEvent.oldState === State.ACTIVE) {
this.state.translateY.setValue(0)
}
};
renderModalContent = gestureHandlerRootHOC(() => (
<View style={{flex:1, justifyContent:'center', backgroundColor:'rgba(0,0,0,0.5)'}}>
<PanGestureHandler
onGestureEvent={this.handleGesture}>
<Animated.View style={{alignItems: 'center', paddingVertical: 14, transform:[{translateY:this.state.translateY}] }}>
<View
style={{
width: 80,
height: 8,
backgroundColor: 'red',
borderRadius: 4,
}}
/>
</Animated.View>
</PanGestureHandler>
</View>
));
render() {
return (
<View style={{flex: 1}}>
<Modal visible={this.state.isModalOpen} transparent={true} onRequestClose={()=>this.closeModal()}>
{this.renderModalContent()}
</Modal>
<TouchableOpacity onPress={() => this.openModal()}>
<Text>Open Modal</Text>
</TouchableOpacity>
</View>
);
}
}
and in App.js if i used CustomComponent directly, it work as expected:

function HomeScreen() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<CustomComponent/>
</View>
);
}
const Stack = createStackNavigator();
function App() {
return(<HomeScreen/>) //work as expected for PanGestureHandler
}
export default App;
but it doesn't work if CustomComponent wrapped in React Navigation:

function HomeScreen() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<CustomComponent/>
</View>
);
}
const Stack = createStackNavigator();
function App() {
return ( // doesn't work, PanGestureHandler `onGestureEvent` props doesn't fire
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
Expected Behavior
Want to fire even in NavigationContainer
How to reproduce
https://snack.expo.io/AW1BDdF_G (I don't know expo cannot drag my component)
Your Environment
| software | version |
|---|---|
| iOS or Android | Android |
| @react-navigation/native | ^5.7.3 |
| @react-navigation/stack | ^5.9.0 |
| react-native-gesture-handler | ^1.8.0 |
| react-native-safe-area-context | ^3.1.8 |
| react-native-screens | ^2.11.0 |
| react-native | 0.63.2 |
| expo | |
| node | node -v (v10.19.0 |
| npm or yarn | yarn -v (1.22.4) |
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit den CustomComponent.js- und App.js-Beispielen im Issue und vergleiche dann das direkte Rendern mit dem Fall mit NavigationContainer und Stack.Navigator. Reproduziere das Android-Verhalten mithilfe des verlinkten Snacks und überprüfe, ob PanGestureHandler's onGestureEvent in beiden Setups ausgelöst wird; abgeschlossen bedeutet, dass die von der Navigation umschlossene Komponente konsistent reagiert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript, react-native
- Bereich
- mobile
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100