Android 应用程序脱机后,React Native AsyncStorage将停止工作
我有一个相对简单的应用程序(我的第一个),它需要显示从GraphQL查询中检索的信息,然后存储在异步存储中。在您关闭数据/Wifi连接并重新启动应用程序之前,一切正常-它不会加载与联网时相同的本地数据。在物理或模拟Android设备上也是如此 没有数据调用,除非用户最初设置其详细信息。该应用程序使用Expo&AWS Amplify的2.7.1版构建。我在这最后一期上浪费了几天时间,在Expo SecureStore&Amplify Cache上也得到了同样的表现,我不愿意继续学习,也不愿意在这样一个简单的应用程序上加入ReduxAndroid 应用程序脱机后,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上也得到了同样的表现,我不愿意继续学习,也不愿意在这样
//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时留下的。我意识到了其中的错误,并更新了除此之外的所有状态更改。我希望这就是它…让我知道它是否不是