Отключить загрузку initialRoute внутри стекового навигатора, когда - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть два стека в моем приложении, подобном этой структуре. Когда я перемещаю пользователя с экрана Home внутри MainStack на Quiz экран внутри QuizStack, вызывается метод componentDidMount экрана QuizList. Как мне это предотвратить? Я хочу, чтобы вызывался только экран componentDidMount из Quiz.

export const MainStack = createStackNavigator({
    Home: { screen: Home },
    Game: { screen: Game },
    Leaderboard: { screen: Leaderboard }
}, { initialRouteName: 'Home' })

export const QuizStack = createStackNavigator({
    QuizList: { screen: QuizList },
    Quiz: { screen: Quiz },
    QuizResult: { screen: QuizResult }
}, { initialRouteName: 'QuizList' })

export const InternalStacks = createBottomTabNavigator({
        QuizStack: { screen: QuizStack, navigationOptions: { tabBarLabel: 'Quiz' } },
        MainStack: { screen: MainStack, navigationOptions: { tabBarLabel: 'Home' } },
    })

Хуже всего то, что при отправке уведомления pu sh пользователи автоматически направляются из Home (MainStack) на Викторина (QuizStack). Метод componentDidMount в Quiz вызывает API, поэтому, если пользователи 10K открывают уведомления, вызывается этот API 10K. Затем по неосторожности также вызывается метод componentDidMount из QuizList (QuizStack), который является дополнительным 10K APIs

1 Ответ

0 голосов
/ 01 февраля 2020

Мне непонятно, почему у вас есть два отдельных стека и как они связаны. Может быть, навигатором верхнего уровня? Вы должны попытаться объединить стеки в один.

Об уведомлении Pu sh вы можете создать SwitchNavigator:

const SwitchNavigator = createSwitchNavigator(
  {
    Loading: LoadingScreen,
    Root: RootStack
  },
  {
    initialRouteName: 'Loading'
  }
)

И в компоненте DiskMount на LoadScreen вы проверьте начальный URL, полученный pu sh.

async componentDidMount() {
    const { navigation } = this.props
    const initialURL = await Linking.getInitialURL()
    if (initialURL && initialURL.startsWith('myapp://myapp/xxx')) {
      navigation.navigate('MyScreenA', { options })
    } else {
      navigation.navigate('MyScreenDefaultScreen')
    }
  }
...