react-native中AsyncStorage存储为什么会失败?

My.js
`componentDidMount(){

    AsyncStorage.getItem('Login',(value) => {
        if(value != null){
            console.log(value);
        }else{
            AsyncStorage.setItem('Login','false',()=>{
                console.log('初始化未登录状态');
            })
        }
})
}`

login.js
`<
TextInput

           onChangeText = {
               (value)=>{
                this.setState({
                    data:value
                },()=>{
                    if(this.state.data == this.props.data){
                            AsyncStorage.setItem('Login','true',()=>{
                            console.log('更新成功');
                            this.props.onChangeLogin('true');
                            Actions.mylogin();  
                            })                     
                                                      }

                })      
            }} 
                   placeholder = '在此输入' 
                   style={{borderWidth:1,
                   borderColor:'black',
                   width:Dimensions.get('window').width * 0.3,
                   height:Dimensions.get('window').height * 0.05,
                   marginTop:20}}>
                   </TextInput>`

我想实现未登录my界面初始化存储Login为false,登陆后为true,但是不知道为什么存储不进去,每次都是null值
阅读 2.5k
1 个回答

时机可能不对,
你是在 Login.js中 setState 的回调函数中调用 AsyncStorage.setItem()存储Login的。这会在login.js此次更新渲染完成后才会执行。
按照一般的APP业务设计,初次进入应该是先加载 My.js,如果发现未登录,再跳转到 Login.js进行登录操作,登录完毕后再回到My.js。
如果你这里是这样设计的话,这涉及到路由导航堆栈的路由页面实例复用,你初次加载My.js的时候,在componentDidMount()中,Login肯定是undefined,后来跳转到Login.js中登录后重新跳转到My.js,此时路由考虑到性能,会卸载Login.js,然后复用一开始的My.js,这就造成了你在componentDidMount()中永远取不到值,你应该在My.js中使用componentDidUpdate()获取

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题