React-Native AsyncStorage

时间:2019-06-20 09:48:25

标签: javascript react-native

我不知道如何使AsyncStorage工作。 我用react-native-router-flux

基本上我有3页:

第一页

export default class Authentication extends Component {

   render() {
    return (
      ..........


          <TouchableOpacity
            style ={[style.button, style.buttonOK]}
            onPress={() => Actions.login() }>
            <Text style={style.buttonTesto}>LOGIN</Text>
          </TouchableOpacity>

          <TouchableOpacity
            style ={[style.button, style.buttonOK]}
            onPress={() => Actions.signup() }>
            <Text style={style.buttonTesto}>SIGNUP</Text>
          </TouchableOpacity>

        </View>
      </View>

    );
  }
}

登录

login() {
    let ctrl = true;
    ......
    if (ctrl) {

      let formdata = new FormData();
      const identity = {
        AppName: {
          Username: this.state.username,
          Password: this.state.password
        }
      };

      formdata.append("Identity", JSON.stringify(identity));
      fetch(APILINK , {
        method: "POST",
        headers: {
          "Content-Type": "multipart/form-data"
        },
        body: formdata
      })
        .then(response => response.json())
        .then(responseData => {
          if (responseData.Error) {
            .......
          } else {
            global.utente = new Utente(responseData);
            Actions.homepageutente();
          }
        })
        .catch(err => alert("err:" + err));
    }
  }

Utente

export default class Utente {
  constructor(data) {
    Utente.saveUtenteLoggato(data);
    this._data = data;
    ....
    );
  }
  get data() {
    return this._data;
  }
  //there is a function for the signup there//
  .......

  static async saveUtenteLoggato(value) {
    try {
      await AsyncStorage.setItem("@UtenteLoggato", JSON.stringify(value));
    } catch (error) {
      console.log(error.message);
    }
  }

  static async getUtenteLoggato() {
    try {
      return await AsyncStorage.getItem("@UtenteLoggato");
    } catch (error) {
      console.log(error.message);
      return null;
    }
  }

  static async clearUtenteLoggato() {
    try {
      global.utente = null;
      await AsyncStorage.removeItem("@UtenteLoggato");
    } catch (error) {
      console.log(error.message);
      return null;
    }
  }
}

因此,在Utente中,我创建了Asyncstorage函数,但是当我在backgroun中关闭应用程序以保持登录状态时,我不知道应该怎么做。目前,如果我返回应用程序,则应该再次登录。 我该怎么解决?

编辑 起始页

class Starting extends Component {
    constructor(props)
    {
      super(props)
      this.state = {
        loading: true
      }
    }

  componentWillMount() {
    Utente.getUtenteLoggato()
      .then(dataUtenteLoggato => {
        if (dataUtenteLoggato !== null) {
          global.utente = new Utente(JSON.parse(dataUtenteLoggato));
        } else {
          Actions.authentication();
        }
      })
      .catch(err => {
        console.log(err);
      })
      .finally(() => {
        this.setState({ loading: false });
      });
  }

  render() {
    return(
      <View style={style.container}>
        <Spinner visible={this.state.loading} textContent={"Loading..."} textStyle={{color: '#FFF'}} />
      </View>
    );
    }
}

1 个答案:

答案 0 :(得分:1)

您可以实现初始屏幕组件并在componentWillMount中检查auth。例如-从AsyncStorage获取数据,然后执行请求以检查用户是否已通过身份验证并获取用户详细信息。如果存储中缺少身份验证数据(例如,身份验证令牌)或服务器抛出了身份验证错误(如果令牌无效或过期),请将用户重定向到登录屏幕,否则将用户标记为已身份验证并显示主屏幕。