AsyncStorage getItem无法在抽屉中工作,无法响应本机路由器流量

时间:2019-02-15 10:35:27

标签: reactjs react-native react-native-router-flux asyncstorage

我试图在抽屉组件的AsyncStorage中获取值。我已经完成了条件渲染,以便在抽屉中显示loginlogout按钮。因此,成功登录后,如果AsynStorage中有值,抽屉中的按钮应该是Logout而不是Login。但是最初在打开抽屉时登录后AsyncStorage的值没有得到。仅当我单击抽屉中的特定项目时才能获取。那么打开抽屉时如何在抽屉中获取值?我完成了以下操作

login.js

async saveItem(item, selectedValue) {
    try {
      await AsyncStorage.setItem(item, selectedValue);
    } catch (error) {
      console.error('AsyncStorage error: ' + error.message);
    }
  }

...
....
...
.then((response) => response.json())
      .then((responseData) => {
        this.setState({
          login: responseData
        })
        if (responseData.status == true) {

          this.saveItem('userdetail', responseData.token.access_token);
          this.saveItem('userimage', responseData.user.avatar);
          this.saveItem('user', responseData.user.name);
          Actions.dashBoard();
          this.setState({ isLoading: false });

        } else {
....
}

drawer.js

componentDidMount() {
        AsyncStorage.getItem("user").then(value => {
            this.setState({ name: value })
        })
        console.log(this.state.name);
    }

onPressList = (data, index) => {
        AsyncStorage.getItem("user").then(value => {
            this.setState({ name: value })
        })
        if (this.state.name) {
            if (data.route == "profile")
                Actions.profile();
       ...
      ....
      ...
}
}

render(){
return(
{this.state.name? (
 <ListItem
                            button
                            noBorder
                            onPress={() => this.onPressLogout()}
                        >

                            <Text style={[styles.text, { textAlign: 'left' }]}>
                                Logout
                            </Text>

                        </ListItem>
) : (
 <ListItem
                            button
                            noBorder
                            onPress={() => this.onPressLogin()}
                        >
                            <Text style={[styles.text, { textAlign: 'left' }]}>
                                Login
                            </Text>

                        </ListItem>) }
)
}     

我检查过是否设置了name的每个列表项都放在抽屉里。只有在name存在的情况下,它才会导航。但是问题最初出在componentDidMount我不知道无法在AsyncStorage中获取值。请帮助我找到解决方案。问题仅在边栏中存在。我正在所有其他屏幕的AsyncStorage中获取值。请帮助。任何帮助都会真的很感谢。谢谢。

1 个答案:

答案 0 :(得分:2)

问题是您正在将用户添加到异步存储之前检查该用户。当您单击某项时它起作用的原因是,您每次单击列表项时都要检查用户。可以使用componentDidMount代替componentWillUpdate。我猜想,当您单击抽屉时,它将更新组件,然后检查用户(因为React重新提供了整个Component子树)。

希望有帮助

    componentWillUpdate() {
        AsyncStorage.getItem("user").then(value => {
            this.setState({ name: value })
        })
        console.log(this.state.name);
    }