У меня проблема с отображением в React Native / React Navigation, когда переход на другую вкладку в навигаторе вкладок вызывает срабатывание плохой анимации отскока при открытии вкладки. Эта проблема возникает только после входа в систему, и после того, как это произойдет один или два раза, больше не повторится.
Ниже представлен 8-секундный видеоролик, посвященный проблеме:
Что я пробовал до сих пор:
InteractionManager.runAfterInteractions внутри componentDidMount () для предотвращения выборки данных во время анимации навигации.
Включение и выключение lazyLoad в TabNavigator
Принудительная перезагрузка просмотра карты с помощью this.forceUpdate () перед переходом на другую вкладку
К сожалению, ничего из этого не сработало, и я не уверен, откуда взялась проблема.
Что я бегу:
Соответствующий фрагмент кода настройки React Navigation (клип показывает навигацию из userInfo> map> yourEvents:
export default class App extends React.Component {
render() {
const Stack = {
FirstView: {
screen: TabNavigator(
{
map: {
screen: HomeMapScreen,
transitionConfig: () => fromLeft(),
navigationOptions: ({ navigation }) => ({
header: null
})
},
yourEvents: {
screen: YourEventsScreen,
transitionConfig: () => fromLeft(),
navigationOptions: ({ navigation }) => ({
header: null
})
},
...
},
{
navigationOptions: {
animationEnabled: "false"
},
tabBarPosition: "bottom",
animationEnabled: false,
swipeEnabled: false,
tabBarOptions: {
showIcon: "true", // Shows an icon for both iOS and Android
style: {
backgroundColor: "#04151F"
},
showLabel: false,
activeTintColor: "#59C9A5",
inactiveTintColor: "#F7FFF7",
labelStyle: {
fontSize: 10
},
iconSize: Platform.OS === "ios" ? 30 : 24
}
}
)
},
...
userInfo: {
screen: UserInfo,
transitionConfig: () => fromLeft(),
navigationOptions: {
drawerLabel: <Hidden />
}
},
...
};
const DrawerRoutes = {
...
Home: {
name: "Home",
screen: StackNavigator(Stack, {
initialRouteName: "FirstView",
transitionConfig: () => fromLeft(),
headerMode: "none",
drawerIcon: () => {
return <Icon name = "map" type = "foundation" size = {30} color = {tintColor} />;
}
})
},
SecondViewStack: {
name: "SecondViewStack",
screen: StackNavigator(Stack, {
initialRouteName: "SecondView",
transitionConfig: () => fromLeft(),
icon: () => {
return <Icon name = "map" type = "foundation" size = {30} color = {tintColor} />;
}
})
}
};
const RootNavigator = StackNavigator(
{
Drawer: {
name: "Drawer",
screen: DrawerNavigator(DrawerRoutes, {
drawerBackgroundColor: "#D8DDEF",
transitionConfig: () => fromLeft(),
contentComponent: DrawerContent,
contentOptions: {
backgroundColor: 'black',
flex: 1
},
})
},
...Stack
},
{
headerMode: "none"
}
);
return (
<Provider store = {store}>
<View style = {styles.container}>
<MyStatusBar translucent backgroundColor = "#04151F" barStyle = "light-content" />
<RootNavigator />
</View>
</Provider>
);
}
}Фрагмент компонента, отображающего проблему "отскока" при загрузке:
class YourEventsScreen extends Component {
state = {
attendingEvents: true,
ownedEvents: false,
isLogoutVisible: false,
animatePressAttend: new Animated.Value(1),
animatePressHost: new Animated.Value(1),
didFinishInitialAnimation: false,
}
static navigationOptions = {
title: "Your Events",
headerLeft: null,
tabBarIcon: ({ tintColor }) => {
return <Icon name = "calendar" size = {30} color = {tintColor} type = "entypo"/>;
}
};
componentDidMount() {
InteractionManager.runAfterInteractions(() => {
this.props.fetchOwnedEvents(this.props.currentUser.userId);
this.props.fetchAttendingEvents(this.props.currentUser.attendingEvents);
this.setState({
...this.state,
didFinishInitialAnimation: true,
});
});
}Мы очень ценим любые идеи или идеи по этому вопросу!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я могу только представить, что здесь происходит: вы где-то используете LayoutAnimation, когда происходит изменение этой вкладки. Хорошая стратегия при возникновении подобных проблем - удалять код до тех пор, пока проблема не будет решена, а затем добавлять его по частям.
Спасибо за комментарий! Единственное, я не использую LayoutAnimation где-либо в своем приложении, если только это не включено по умолчанию и не должно быть явно отключено. Но тогда я обязательно попробую разобраться с ошибками, связанными с анимацией.
Возможно, что библиотека, которую вы используете, использует LayoutAnimation, даже если вы об этом не знаете!
У меня была аналогичная проблема, когда я переключал видимость MapView, обновляя состояние с помощью функций react-navigationonDidFocus и onWillBlur (из NavigationEvents).
Как только я перестал обновлять это и удалил свой параметр showMap, эффект отскока исчез.
ты решил это?