React Native Mobx 空指针取消引用
React Native Mobx null pointer dereference
我正在使用 mobx(和 mobx-persist)作为我的 React 本机应用程序全球商店(我正在使用 expo 客户端)。首先,我从服务器获取一些数据,然后将结果保存在商店中,并将它们保存在 asyncStorage 中。一开始它运行良好,但当我尝试登录时,应用程序突然冻结,然后崩溃并显示包含 "Cause: null pointer dereference" 的摘要。以下是我的代码。
商店代码:
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.log(err))
正在保存 AuthToken 和术语,但公交车在登录时返回 null 或使应用程序崩溃。
经过几个小时的调试和搜索后,我发现一些人面临着类似的问题,因为他们试图保存嵌套对象的大数组,所以我想也许总线数组实际上有那么大(虽然不是)所以我尝试只用一个键保存一个对象-总线中的值对但没有成功。
已通过使用自定义 class 的持久列表修复:
在class商店:
@persist('list', Bus) @observable Buses = []
和 class 公交车:
class Bus {
@persist @observable someField1 = ''
@persist @observable someField2 = false
@persist('list', field) @observable fields = []
}
甚至 class 总线使用了另一个 class 字段:
class field {
@persist @observable someField1 = ''
@persist @observable someField2 = ''
}
我正在使用 mobx(和 mobx-persist)作为我的 React 本机应用程序全球商店(我正在使用 expo 客户端)。首先,我从服务器获取一些数据,然后将结果保存在商店中,并将它们保存在 asyncStorage 中。一开始它运行良好,但当我尝试登录时,应用程序突然冻结,然后崩溃并显示包含 "Cause: null pointer dereference" 的摘要。以下是我的代码。
商店代码:
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.log(err))
正在保存 AuthToken 和术语,但公交车在登录时返回 null 或使应用程序崩溃。 经过几个小时的调试和搜索后,我发现一些人面临着类似的问题,因为他们试图保存嵌套对象的大数组,所以我想也许总线数组实际上有那么大(虽然不是)所以我尝试只用一个键保存一个对象-总线中的值对但没有成功。
已通过使用自定义 class 的持久列表修复:
在class商店:
@persist('list', Bus) @observable Buses = []
和 class 公交车:
class Bus {
@persist @observable someField1 = ''
@persist @observable someField2 = false
@persist('list', field) @observable fields = []
}
甚至 class 总线使用了另一个 class 字段:
class field {
@persist @observable someField1 = ''
@persist @observable someField2 = ''
}