• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - react 原生 : storage only works in simulator

[复制链接]
菜鸟教程小白 发表于 2022-12-13 15:56:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我尝试过 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-推荐答案


按照 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap