У меня есть функция, которая проверяет, был ли этот пользователь связан ранее или нет. Когда пользователь Auth связался, я показываю кнопку. При нажатии он спрашивает пользователя, хочет ли он выйти из этого приложения или нет. Если я нажимаю «да», я звоню BackHandler.exitApp()
, поэтому он должен выйти из приложения, и это означает, что все данные формы понятны, верно?
Но после выхода из приложения и его повторного открытия, появляется поле ввода очищается . Но когда я отправляю эти данные в firebase, он отправляет предыдущие данные, которые я набрал, перед выходом из приложения. Я не знаю почему!
state = {
....
params: this.props.navigation.state.params,
message: props.navigation.getParam('message'),
email: props.navigation.getParam('email'),
....
}
componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.backPressed);
}
backPressed = () => {
if (Platform.OS === 'android') {
if (this.props.navigation.isFocused()) {
Alert.alert(
'Exit',
'Do you want to exit the app?',
[
{
text: 'No',
onPress: () => console.log('Cancel Pressed'),
style: 'cancel',
},
{text: 'Yes', onPress: () => BackHandler.exitApp()},
],
{cancelable: false},
);
return true;
}
}
};
confirmCode = codeInput => {
const {confirmResult} = this.state;
if (confirmResult && codeInput.length) {
confirmResult
.confirm(codeInput)
.then(async user => {
console.log(user.uid);
this.setState({uid: user.uid});
clearInterval(this.interval);
this.setState(
{
timer: 0,
isValid: true,
isNotLinked: false,
},
() => {
this.authStateChange();
},
);
})
.catch(error => {
let errorCode = error.code;
let errorMessage = error.message;
console.log('confirmCode-errorCode', errorCode);
console.log('confirmCode-errorMessage', errorMessage);
});
}
};
//here's function check if linked befor or not
authStateChange = async () => {
const {email, password} = this.state;
auth().onAuthStateChanged(async user => {
if (user) {
this.setState({user: user.toJSON()});
let credential = firebase.auth.EmailAuthProvider.credential(
email,
password,
);
await auth().currentUser.linkWithCredential(credential)
.then(async usercred => {
var user = usercred.user;
const {params} = this.props.navigation.state;
console.log('Account linking success:', user);
params.createUser(user.uid);
this.setState({isNotLinked: false});
})
.catch(async error => {
this.setState({isNotLinked: true});
let errorCode = error.code;
let errorMessage = error.message;
console.log('errorMessage', errorMessage);
switch (errorCode) {
case 'auth/unknown':
console.log('User has already been Linked :)');
alert('this account linked before');
await AsyncStorage.removeItem('data').then(() =>
console.log('deleted storge'),
);
clearInterval(this.interval);
this.setState({
message: 'try again with new number',
isValid: false,
disable: true,
timer: 0,
codeInput: '',
});
break;
case 'auth/user-token-expired':
alert(
'user-token-expired ..',
);
default:
console.log('Default');
break;
}
});
}
});
};
Пользовательский интерфейс
<TouchableOpacity
disabled={!this.state.isNotLinked}
onPress={() => this.backPressed()}
style={{opacity: this.state.isNotLinked ? 1 : 0}}>
<Text style={styles.textStyle}>Try Again</Text>
</TouchableOpacity>
Решено?
Когда я регистрирую состояние в componentDidMount
, каждый элемент, который появляется, новые данные ожидают Params
он получает предыдущий результат. Поэтому я очищаю его перед выходом из приложения, как это, и он работает нормально. Если у кого-нибудь есть объяснение этому поведению, потому что я знаю, что если я выхожу из приложения, это означает, что состояние ясно?
onPress: () => {
this.setState({params:{} }, () =>
console.log('rest?', this.state.confirmResult),
),
BackHandler.exitApp();
},