应用离线后,React Native AsyncStorage将停止工作

时间:2019-01-31 14:55:12

标签: android react-native expo asyncstorage

我有一个相对简单的应用程序(我的第一个应用程序),该应用程序需要显示从GraphQL查询中检索到并存储在AsyncStorage中的信息。一切正常,直到您关闭数据/ 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) { 
        //...
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您严重使用了更改状态的事实。

执行此操作的地方:

response.close()

您应该使用setState()函数更改状态,如下所示:

auto outPutString = inputString
.Apply(Transformation1)
.Apply(Transformation2)

答案 1 :(得分:0)

您要存储字符串吗?异步存储只能存储字符串。尝试使用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) { 
        //...
        }
    }
}

答案 2 :(得分:0)

这与外部API冲突