Каким образом можно обнаружить первый и начальный запуск приложения с реакцией, чтобы показать встроенный/вводный экран?
Как обнаружить первый запуск в реагировании
Ответ 1
Ваша логика должна следовать этому:
class MyStartingComponent extends React.Component {
constructor(){
super();
this.state = {firstLaunch: null};
}
componentDidMount(){
AsyncStorage.getItem("alreadyLaunched").then(value => {
if(value == null){
AsyncStorage.setItem('alreadyLaunched', true); // No need to wait for `setItem` to finish, although you might want to handle errors
this.setState({firstLaunch: true});
}
else{
this.setState({firstLaunch: false});
}}) // Add some error handling, also you can simply do this.setState({fistLaunch: value == null})
}
render(){
if(this.state.firstLaunch === null){
return null; // This is the 'tricky' part: The query to AsyncStorage is not finished, but we have to present something to the user. Null will just render nothing, so you can also put a placeholder of some sort, but effectively the interval between the first mount and AsyncStorage retrieving your data won't be noticeable to the user.
}else if(this.state.firstLaunch == true){
return <FirstLaunchComponent/>
}else{
return <NotFirstLaunchComponent/>
}
}
Надеюсь, что это поможет
Ответ 2
Я внес некоторые коррективы в предложение martinarroyo. AsyncStorage.setItem
должен установить строковое значение, а не bool.
import { AsyncStorage } from 'react-native';
const HAS_LAUNCHED = 'hasLaunched';
function setAppLaunched() {
AsyncStorage.setItem(HAS_LAUNCHED, 'true');
}
export default async function checkIfFirstLaunch() {
try {
const hasLaunched = await AsyncStorage.getItem(HAS_LAUNCHED);
if (hasLaunched === null) {
setAppLaunched();
return true;
}
return false;
} catch (error) {
return false;
}
}
Затем эту функцию можно импортировать там, где она вам нужна. Обратите внимание, что вы должны отобразить нуль (или что-то еще умное), ожидая, когда функция async проверит AsyncStorage.
import React from 'react';
import { Text } from 'react-native';
import checkIfFirstLaunch from './utils/checkIfFirstLaunch';
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
isFirstLaunch: false,
hasCheckedAsyncStorage: false,
};
}
async componentWillMount() {
const isFirstLaunch = await checkIfFirstLaunch();
this.setState({ isFirstLaunch, hasCheckedAsyncStorage: true });
}
render() {
const { hasCheckedAsyncStorage, isFirstLaunch } = this.state;
if (!hasCheckedAsyncStorage) {
return null;
}
return isFirstLaunch ?
<Text>This is the first launch</Text> :
<Text>Has launched before</Text>
;
}
}
Ответ 3
Допустим, у меня есть несколько пользователей, которые могут войти в одно приложение через одно устройство. как это будет работать текущая реализация может позаботиться о регистрации в первый раз независимо от пользователя.
Может ли кто-нибудь, пожалуйста, дайте мне знать, как это сделать,
Мой сценарий - приложение установлено, и для каждого пользователя, если при первом входе в систему я показываю этот экран приветствия, одно устройство, на котором установлено приложение, может иметь несколько входов в систему. поэтому каждый раз, когда я должен проверить, если первый вход в систему для конкретного пользователя, пожалуйста, покажите экран приветствия.