Android 应用程序脱机后,React Native AsyncStorage将停止工作

Android 应用程序脱机后,React Native AsyncStorage将停止工作,android,react-native,expo,asyncstorage,Android,React Native,Expo,Asyncstorage,我有一个相对简单的应用程序(我的第一个),它需要显示从GraphQL查询中检索的信息,然后存储在异步存储中。在您关闭数据/Wifi连接并重新启动应用程序之前,一切正常-它不会加载与联网时相同的本地数据。在物理或模拟Android设备上也是如此 没有数据调用,除非用户最初设置其详细信息。该应用程序使用Expo&AWS Amplify的2.7.1版构建。我在这最后一期上浪费了几天时间,在Expo SecureStore&Amplify Cache上也得到了同样的表现,我不愿意继续学习,也不愿意在这样

我有一个相对简单的应用程序(我的第一个),它需要显示从GraphQL查询中检索的信息,然后存储在异步存储中。在您关闭数据/Wifi连接并重新启动应用程序之前,一切正常-它不会加载与联网时相同的本地数据。在物理或模拟Android设备上也是如此

没有数据调用,除非用户最初设置其详细信息。该应用程序使用Expo&AWS Amplify的2.7.1版构建。我在这最后一期上浪费了几天时间,在Expo SecureStore&Amplify Cache上也得到了同样的表现,我不愿意继续学习,也不愿意在这样一个简单的应用程序上加入Redux

//import from react native not react
import { AsyncStorage } from 'react-native'

//calling a function as app loads
componentDidMount() {
    this._loadInitialState();
}

//retrieving String from AsyncStorage
_loadInitialState = async () => {
    try {
        const policyNum = await AsyncStorage.getItem('policyNum')
        //...
    } catch {
        //...
    }

//setting state
if (policyNum != null && policyNum != undefined) {
        this.setState({ policyNum: policyNum })
    //...
}

//the original setting of the item
setPolicyDetails = async () => {
    if (this.state.policyNum != null) {
        const policyNumber = this.state.policyNum
        this.state.policyNumSet = true
        try {
            await AsyncStorage.setItem('policyNum', policyNumber)
        } catch (err) { 
        //...
        }
    }
}

你在利用改变状态的事实

在执行此操作时:

    this.state.policyNumSet = true
应使用setState()函数更改状态,如下所示:

    this.setState({ policyNumSet: true })

您正在存储字符串吗?异步存储只能存储字符串。尝试使用JSON.stringify和JSON.parse

_loadInitialState = async () => {
    try {
        var policyNum = await AsyncStorage.getItem('policyNum')
        policyNum = JSON.parse(policyNum) // converting to original
        //...
    } catch {
        //...
    }

//setting state
if (policyNum != null && policyNum != undefined) {
        this.setState({ policyNum: policyNum })
    //...
}

//the original setting of the item
setPolicyDetails = async () => {
    if (this.state.policyNum != null) {
        const policyNumber = this.state.policyNum
        this.setState({ policyNumSet: true })
        try {
            var policyNumberString = JSON.stringify(policyNumber)
            await AsyncStorage.setItem('policyNum', policyNumberString) //converting to string
        } catch (err) { 
        //...
        }
    }
}

这与外部API冲突

您显然是在使用行
This.state.policyNumSet=true
更改状态,您应该使用
This.setState({policyNumSet:true})
。谢谢Andrew,我想我已经更新了所有早期的noob错误。。。我会仔细检查是否有更多的剩菜,然后试一试。不幸的是,这似乎不是问题所在。我认为这不是问题所在。这只是我指出的一个编码错误。ValdaXD-谢谢,是的,这是一个字符串&我一直在将GraphQL查询结果字符串化为JSON,并成功地检索它们&在重新启动时显示它们。只有当网络被禁用时,它才能检索到任何东西。这真的非常奇怪,因为异步存储应该脱机工作。尝试另一种解决方案,如果不起作用,请在启动时删除每个api/fetch调用并联机启动应用程序,如果数据加载,这是一个错误,如果数据不加载,这意味着它从未出现过,您应该控制台。记录您正在检索的policyNum这很奇怪,但我遇到了几个关于异步存储不起作用的错误报告,但这并不是说它与连接一起工作,也不是在脱机时工作。应用程序仅在用户交互时发出API请求(用户提交代码)。当应用程序加载时,它只检查异步存储,然后设置在主屏幕上显示信息的状态。如果他们选择更新代码,则会发送一个新请求&savedThanks ValaXD!我又看了一眼,发现有一个api在检查用户信息,它并不像我最初想的那样在令牌上离线工作,而是轮询一个服务。谢谢,这是我从一个糟糕的Youtube视频开始学习React Native时留下的。我意识到了其中的错误,并更新了除此之外的所有状态更改。我希望这就是它…让我知道它是否不是