Я пытаюсь использовать React Navigation для управления потоком приложения. Когда приложение открывается, оно загружает стековый навигатор, который имеет два экрана: Home (главный экран моего приложения) и Access (компонент, который является еще одним стековым навигатором, который начинается со страницы входа в систему). Это мой App.js
:
import React, { Component } from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import Access from './screens/access/index';
import Home from './screens/Home';
const Root = createAppContainer(createStackNavigator({
Home: { screen: Home },
Access: { screen: Access }
}, {
headerMode: 'none',
mode: 'modal'
}));
export default class App extends Component {
render() {
return (
<Root />
);
}
}
На моем домашнем экране я проверяю, вошел ли пользователь (в конструкторе), и если нет, я хочу показать экран доступа как модальный. Очевидно, я мог вызвать this.props.navigation.navigate({ routeName: 'Access' })
из конструктора, но я хочу избежать анимации. Я думал в конструкторе ./screens/Home
Я бы попробовал:
const resetAction = StackActions.reset({
index: 1,
actions: [
NavigationActions.navigate({ routeName: 'Home' }),
NavigationActions.navigate({ routeName: 'Access' }),
],
});
this.props.navigation.dispatch(resetAction);
Каким-то образом это не удается, потому что Error: There is no route defined for key Home. Must be one of: 'Login','Password','Signup'
. Это, безусловно, относится к маршрутам в стековом навигаторе, определенном в ./screens/access/index
:
import React, { Component } from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import Login from './Login';
import Password from './Password';
import Signup from './Signup';
const Access = createStackNavigator({
Login: { screen: Login },
Password: { screen: Password },
Signup: { screen: Signup }
}, {
headerMode: 'none'
});
export default createAppContainer(Access);
Однако я не уверен, почему он считает, что это маршруты, когда я звоню this.props.navigation.dispatch
в ./screens/Home
.
Наконец, по отдельной проблеме, я хочу иметь возможность отклонить модал с экранов доступа. На первом экране этого стека (Вход в систему) я могу вызвать this.props.navigation.dispatch(NavigationActions.back())
, чтобы закрыть модал. Тем не менее, если при входе в систему происходит принудительная регистрация, это просто возвращает к входу в систему (вместо отклонения модального режима). Как мне этого добиться?