我尝试过 AsyncStorage、react-native-store 和 react-native-simple-store,它们都可以在模拟器中运行,但不能在设备上运行。我正在使用 redux 和 redux-thunk 来加载存储的状态。我在根组件的 componentDidMount 方法中调用了以下函数(使用 react-native-simple-store):
export function loadState() {
return (dispatch, getState) => {
store.get('state').then((state) => {
if (state) {
let action = {
type: LOAD_STATE,
state: fromJS(state),
};
dispatch(action);
} else {
store.save('state', initialState);
}
}).catch((error) => {
console.log(error);
});
};
}
然后在我的 reducer 中,当用户触发更新时,我将在返回新状态之前更新存储中的状态,如下所示:
case SET_UPDATED_DATE:
newState = state.set('updatedDate', action.date);
store.update('state', newState.toJS())
.catch((error) => console.log(error));
return newState;
初始化/更新方法是否不足?是否需要为设备进行特殊设置?或者在设备上运行时不支持 redux-thunk - main.jsbundle 或使用开发服务器 - (将日志语句放在 loadState 函数的返回函数的顶部让我相信它可能不会在设备上被调用)?
Best Answer-推荐答案 strong>
按照 AsyncStorage 文档的示例,我找到了一种使其工作的方法。在我的 reducer 文件中(我的 redux 状态是一个 Immutable.js 对象):
var STORAGE_KEY = '@AppName:state';
export function loadState() {
return async (dispatch, getState) => {
try {
var value = await AsyncStorage.getItem(STORAGE_KEY);
if (value !== null) {
dispatch(replaceState(value));
console.log('Recovered selection from disk:');
console.log(value);
} else {
saveState(JSON.stringify(initialState.toJS()));
console.log('No state on disk. Initialized with initialState.');
}
} catch (error) {
console.log('AsyncStorage error: ' + error.message);
}
};
}
function replaceState(newState) {
return {
type: REPLACE_STATE,
newState: fromJS(JSON.parse(newState)),
};
}
async function saveState(state) {
try {
await AsyncStorage.setItem(STORAGE_KEY, state);
console.log('Saved selection to disk:');
console.log(state);
} catch (error) {
console.log('AsyncStorage error: ' + error.message);
}
}
然后在reducer函数中:
case SET_UPDATED_DATE:
newState = state.set('updatedDate', action.date);
saveState(JSON.stringify(newState.toJS()));
return newState;
关于ios - react 原生 : storage only works in simulator,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/36526974/
|