Проблема в том, что проверка токена занимает всего секунду, и страница отображается на короткое время.
Причина в том, что чтение / запись из / в AsyncStorage является асинхронной операцией.
На моем экране я вызываю эту функцию в жизненном цикле ComponentWillMount.
Я предлагаю вам не использовать ComponentWillMount жизненный цикл, поскольку он устарел и будет удален из React (https://reactjs.org/docs/react-component.html#unsafe_componentwillmount)
После этого вступления я покажу вам, как я этого добился в своем приложении: API КОНТЕКСТА! (https://reactjs.org/docs/context.html)
Контекст обеспечивает способ передачи данных через дерево компонентов без необходимости вручную передавать реквизиты на каждом уровне.
Как реализовать контекстный API:
контекст будет «состоянием» вашего файла App.js. Ваш root.js будет провайдером контекста, в то время как другие представления, которым потребуется контекст, называются потребителей контекста.
- Прежде всего, вам нужно создать «скелет» вашего контекста в отдельный файл, что-то вроде этого:
// AuthContext.js
import React from 'react'
const AuthContext = React.createContext({
isLogged: false,
login: () => {},
logout: () => {}
})
export default AuthContext
- Ваш App.js импортирует, содержит и инициализирует контекст:
// App.js
// all necessary imports
import AuthContext from '....'
export default class App extends React.Component {
constructor (props) {
super(props)
this.state = {
isAuth: false,
login: this.login,
logout: this.logout
}
login = async userData => {
// do your login stuff and then
this.setState({ isAuth: true })
}
logout = async () => {
// do your logout stuff and then
this.setState({ isAuth: false })
}
async ComponentDidMount () {
// check the asyncStorage here and then, if logged:
this.setState({ isAuth: true })
}
render () {
return (
<AuthContext.Provider value={this.state}>
<AppContainer />
</AuthContext.Provider>
)
}
- Затем в представлении, содержащемся в AppContainer, вы можете получить доступ к контексту следующим образом:
import AuthContext from '.....'
// all necessary imports
export default class YourView extends React.Component<Props, State> {
constructor (props) {
super(props)
this.props = props
this.state = { ... }
}
// THIS IS IMPORTANT
static contextType = AuthContext
// with this, you can access the context through 'this.context'
ComponentDidMount () {
if (!this.context.isAuth) this.props.navigation.navigate('login')
}
Преимущества этого подхода:
- Проверка логического значения выполняется так быстро, что вы не увидите пустой экран.
- Общий доступ к контексту аутентификации в вашем приложении
- Предоставление доступа к asyncstorage только при первом монтировании приложения, а не каждый раз, когда вам нужно проверять, вошел ли пользователь в систему
- Совместное использование методов входа / выхода из любого места в вашем приложении