React Native AsyncStorage перестает работать, когда приложение отключено - PullRequest
0 голосов
/ 31 января 2019

У меня есть относительно простое приложение (мое первое), которое должно отображать информацию, полученную из запроса GraphQL и затем сохраненную в AsyncStorage.Все работает нормально, пока вы не отключите соединения data / Wifi и не перезапустите приложение - оно не будет загружать те локальные данные, которые были при включенной сети.Это то же самое на физическом или эмулируемом устройстве Android.

Нет вызовов для передачи данных, кроме случаев, когда пользователь изначально устанавливает свои данные.Приложение построено с версией 2.7.1 Expo & AWS Amplify.Я потратил несколько дней на эту последнюю проблему и получил то же поведение с 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 голосов
/ 31 января 2019

Вы храните строку?Только asyncstorage может хранить строки.попробуйте использовать 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) { 
        //...
        }
    }
}
0 голосов
/ 31 января 2019

Это был конфликт с внешним API

0 голосов
/ 31 января 2019

Вы плохо используете факт изменения состояния.

Где вы это делаете:

    this.state.policyNumSet = true

Вы должны изменить состояние с помощью функции setState (), например:

    this.setState({ policyNumSet: true })
...