Проблема с отображением навигации по вкладкам React Native

У меня проблема с отображением в React Native / React Navigation, когда переход на другую вкладку в навигаторе вкладок вызывает срабатывание плохой анимации отскока при открытии вкладки. Эта проблема возникает только после входа в систему, и после того, как это произойдет один или два раза, больше не повторится.

Ниже представлен 8-секундный видеоролик, посвященный проблеме:

Youtube клип с ошибкой

Что я пробовал до сих пор:

  • InteractionManager.runAfterInteractions внутри componentDidMount () для предотвращения выборки данных во время анимации навигации.

  • Включение и выключение lazyLoad в TabNavigator

  • Принудительная перезагрузка просмотра карты с помощью this.forceUpdate () перед переходом на другую вкладку

К сожалению, ничего из этого не сработало, и я не уверен, откуда взялась проблема.

Что я бегу:

  • "реагировать-навигация": "^ 1.5.11"
  • "экспо": "^ 26.0.0"

Соответствующий фрагмент кода настройки 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,
       });
     });
  }

Мы очень ценим любые идеи или идеи по этому вопросу!

ты решил это?

Milan Poliak 29.04.2021 01:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
799
2

Ответы 2

Я могу только представить, что здесь происходит: вы где-то используете LayoutAnimation, когда происходит изменение этой вкладки. Хорошая стратегия при возникновении подобных проблем - удалять код до тех пор, пока проблема не будет решена, а затем добавлять его по частям.

Спасибо за комментарий! Единственное, я не использую LayoutAnimation где-либо в своем приложении, если только это не включено по умолчанию и не должно быть явно отключено. Но тогда я обязательно попробую разобраться с ошибками, связанными с анимацией.

Brandon Hill 06.11.2018 05:06

Возможно, что библиотека, которую вы используете, использует LayoutAnimation, даже если вы об этом не знаете!

brentvatne 06.11.2018 22:48

У меня была аналогичная проблема, когда я переключал видимость MapView, обновляя состояние с помощью функций react-navigationonDidFocus и onWillBlur (из NavigationEvents).

Как только я перестал обновлять это и удалил свой параметр showMap, эффект отскока исчез.

Другие вопросы по теме