Как очистить данные формы после выхода из приложения React-Native? - PullRequest
0 голосов
/ 12 января 2020

У меня есть функция, которая проверяет, был ли этот пользователь связан ранее или нет. Когда пользователь 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();
              },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...