Разыменование нулевого указателя React Native Mobx

Я использую mobx (и mobx-persist) в качестве глобального хранилища собственных приложений для реагирования (я использую клиент expo). Сначала я получаю некоторые данные с сервера, затем сохраняю результаты в хранилище и сохраняю их в asyncStorage. Сначала он работал нормально, но затем внезапно, когда я пытаюсь войти в систему, приложение зависает, а затем вылетает со сводкой, содержащей «Причина: разыменование нулевого указателя». Ниже приведен мой код.

Код магазина:

import { observable, computed, action, set } from 'mobx';
import { create, persist } from 'mobx-persist';
import { AsyncStorage } from 'react-native';

class Store {
    URL = 'XX.XX.XX.XX'
    @persist('object') @observable db = {
        authToken: '',
        buses: null,
        term: null,
    }

    @computed get buses () {
        return this.db.buses
    }

    @computed get term () {
        return this.db.term
    }

    @computed get authToken () {
        return this.db.authToken
    }

    @action setAuthToken = (token) => {
        this.db.authToken = token;
    }

    @action setBuses = (buses) => {
        this.db.buses = buses;
    }

    @action setTerm = (term) => {
        this.db.term = term;
    }
}

const hydrate = create({
    storage: AsyncStorage,
    jsonify: true
})

store = new Store()

storeLoader = async () => {
    await hydrate('object', store)
    return store
}
hydrate('object', store)
module.exports = { store, storeLoader }

Код входа в систему:

import { store } from './store'
import { observer } from 'mobx-react';


 fetch(`http://${store.URL}/login`, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        email: this.state.email,
        password: this.state.password
    })
}).then(res => res.json()).then(res => {
    if (res.token) {
        store.setAuthToken(res.token)
        store.setTerm(res.term)
        store.setBuses(res.buses.sort((a, b) => {
            let first = a.fields[0].time, second = b.fields[0].time;
            let firstArr = first.split(":", 2), secondArr = second.split(":", 2);
            if (firstArr[0] !== secondArr[0])
                return firstArr[0] - secondArr[0];
            else
                return firstArr[1] - secondArr[1];
        }))
        this.props.navigation.navigate("App")
    }
    if (res.error) {
        this.setState({error: res.error})
    }
}).catch(err => console.info(err))

И AuthToken, и термин сохраняются, но шины либо возвращают значение null при регистрации, либо приводят к сбою приложения. После отладки и поиска в течение нескольких часов я обнаружил, что некоторые люди сталкиваются с похожими проблемами, потому что они пытались сохранить большие массивы вложенных объектов, поэтому я подумал, что, возможно, массив автобусов на самом деле такой большой (хотя это не так), поэтому я попытался сохранить объект только с 1 ключом -value в автобусах, но безуспешно.

просто предположение, сделайте сортировку setBusses, затем передайте отсортированный объект

Amir-Mousavi 22.03.2019 11:57

Я попытался просто вставить объект с 1 дочерним элементом, все еще

mahmoudafer 22.03.2019 13:36
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
2
2
448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправлено с помощью постоянного списка пользовательского класса:

В магазине класса:

@persist('list', Bus) @observable Buses = []

и в классе Автобус:

class Bus {
    @persist @observable someField1 = ''
    @persist @observable someField2 = false
    @persist('list', field) @observable fields = []
}

даже класс Bus использовал другое поле класса:

class field {
    @persist @observable someField1 = ''
    @persist @observable someField2 = ''
}

Другие вопросы по теме